jjzjj

c# - 从 xsd 生成的代码中复数化属性

coder 2024-06-28 原文

我有一个 XSD 描述了我正在构建的应用程序中的一些数据契约的架构。我在编写 xsd 文件方面不是最有经验的,但到目前为止,我尝试过的任何方法都无法解决我的问题。

我有一部分架构看起来像这样:

<xs:complexType name="RecordSetDefinition">
  <xs:sequence>
    <xs:element name="RecordId" type="RecordIdDefinition" minOccurs="0" maxOccurs="unbounded" />
    <xs:element name="Record" type="RecordDefinition" minOccurs="0" maxOccurs="unbounded" />
  </xs:sequence>
  <xs:attribute name="Id" type="xs:string" />
</xs:complexType>

这对应的 XML 如下所示:

<RecordSet Id="Test">
  <RecordId ...>
    ...
  </RecordId>
  <RecordId ...>
    ...
  </RecordId>
  <Record ...>
    ...
  </Record>
  <Record ...>
    ...
  </Record>
  <Record ...>
    ...
  </Record>
</RecordSet>

我的想法是,我的 RecordSetDefinition 数据协定有一个 RecordIdDefinitionRecordDefinition 数组。运行生成命令:

xsd \c \l:cs

产生:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="...")]
public partial class RecordSetDefinition {

    private RecordIdDefinition[] recordIdField;

    private RecordDefinition[] recordField;

    private string idField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("RecordId")]
    public RecordIdDefinition[] RecordId {
        get {
            return this.recordIdField;
        }
        set {
            this.recordIdField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Record")]
    public RecordDefinition[] Record {
        get {
            return this.recordField;
        }
        set {
            this.recordField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Id {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }
}

这一切都很好而且花花公子......除了包含定义数组的属性的名称是单数,而不是复数。

问题:

为了帮助代码理解,我希望将这些名称复数化(即 RecordIds 而不是 RecordId)。这是否可以使用 XSD 来实现,以便 xsd.exe 将在 C# 中生成复数数组名称,同时仍保持 XML 中的单个元素名称?

XML 是任意的并且可以更改,但到目前为止,我似乎无法找到能够提供我想要的结果的架构排列。我得到的最接近的是制作一个名为 RecordIds 的元素,其中包含单独的 RecordId 记录,但这仍然导致相当不直观的 RecordIds.RecordId[] 属性。使用 xs:choice 会生成 RecordIds.Items[],这会起作用,但我想知道是否有更好的方法。

我不能只修改生成的代码,因为显然下次我们从 .xsd 生成 .cs 文件时它会被覆盖,这会带来可维护性问题对于下一位出现的开发人员。

最佳答案

我不确定 xsd.exe 是否可行

我认为最简单的解决方案是找到更好的名称。 RecordIdList.RecordId[] 怎么样?

另一种方法是使用分部类。如果您能找到一种方法在分部类中获取您的 RecordIds,则您可以重新生成其余代码而无需更改它们。

您也可以尝试使用 xsd2code .它没有自动生成复数名称的能力,但由于它是开源的,您可以更改它来为您生成复数名称。

另一种解决方案是在生成代码后对其进行转换。编写一个脚本,在生成 .cs 文件后对其进行修改。

我的选择是。

  1. 找一个更好的名字
  2. 保持原样并可能在以下代码中添加注释 为什么名称是单数的,以便下一个开发人员知道发生了什么。

关于c# - 从 xsd 生成的代码中复数化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29616259/

有关c# - 从 xsd 生成的代码中复数化属性的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  7. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  8. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  9. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  10. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

随机推荐