xsd.exe 在 OFX2 架构上运行时生成重复的属性

Posted

技术标签:

【中文标题】xsd.exe 在 OFX2 架构上运行时生成重复的属性【英文标题】:xsd.exe generates duplicate attributes when run on OFX2 schema 【发布时间】:2010-11-21 08:42:30 【问题描述】:

使用命令行:

"xsd.exe" "OFX 2.1.1 schema/OFX2_Protocol.xsd" /c /namespace:OFX /nologo"

生成的 C# 源文件无法构建并出现以下错误:

D:\blah\OFX2_Protocol.cs(19,6): error CS0579: Duplicate 'System.CodeDom.Compiler.GeneratedCodeAttribute' attribute
D:\blah\OFX2_Protocol.cs(20,6): error CS0579: Duplicate 'System.SerializableAttribute' attribute
D:\blah\OFX2_Protocol.cs(21,6): error CS0579: Duplicate 'System.Diagnostics.DebuggerStepThroughAttribute' attribute
D:\blah\OFX2_Protocol.cs(22,6): error CS0579: Duplicate 'System.ComponentModel.DesignerCategoryAttribute' attribute
D:\blah\OFX2_Protocol.cs(23,6): error CS0579: Duplicate 'System.Xml.Serialization.XmlTypeAttribute' attribute
D:\blah\OFX2_Protocol.cs(24,6): error CS0579: Duplicate 'System.Xml.Serialization.XmlRootAttribute' attribute

我从 OFX2 架构中复制了一个类似的 XSD 架构,然后将其修剪为我想要的有用位,生成一个 C# 文件,该文件构建得很好,但具有与完整架构的 C# 表示形式相同的所有属性。

知道为什么吗? OFX 架构是否损坏? xsd.exe 坏了吗? C#坏了吗?我坏了吗?

【问题讨论】:

【参考方案1】:

好的,这个答案好久不见了……

我刚刚遇到了同样的问题。问题不在于 foo.cs,而在于 foo.designer.cs。您必须删除第二类中的重复属性。

C# 应该允许跨部分类的重复属性,或者修复 xsd 以忽略除 .cs 文件之外的所有属性。

【讨论】:

刚刚注意到这个答案 - 虽然“修复 xsd”并不可行,但它绝对是正确的 :) 行为显然是错误的,我认为这不是我们的错。 我同意。有些东西坏了,这不是我们的错。 谢谢。在 Visual Studio 中,如果您根本不想生成设计器文件,可以编辑 xsd 文件的属性并将“自定义工具”设置为空白。【参考方案2】:

OFX 规范下载的最新版本有一个“OFX3_Protocol_dotNET.xsd”,它已从“OFX2_Protocol.xsd”修改为更适合 .NET 代码生成工具。尽管我还没有反序列化任何 XML,但我已经从这个 xsd 生成了 C#,没有任何问题。

【讨论】:

【参考方案3】:

我在不同的架构下遇到了同样的问题(同样的“重复属性”问题)。原因是由于 2 个 xsd 模式(2 个生成的文件),并且在每个模式中我都有相同的“类型”元素,但定义不同。将其中一种类型重命名为不同的名称解决了问题

【讨论】:

【参考方案4】:

我自己也遇到了这个问题,结果发现对于那些我遇到重复属性错误的类已经在同一命名空间下的其他地方声明了。因此,任何试图排除故障的人,都需要确保罪魁祸首类在给定的命名空间下只声明一次。例如,XSD.exe 导入生成以下类:

namespace Example.Imports 

  using System.Xml.Serialization;

    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.example.com/Common")]
    [System.Xml.Serialization.XmlRootAttribute("order", Namespace="http://www.example.com/Order", IsNullable=false)]
    public partial class OrderType 
    
        private DocType docField;
        
        public DocType doc 
            get 
                return this.docField;
            
            set 
                this.docField = value;
            
        
    
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.example.com/Common")]
    public partial class DocType 
        
        private System.Xml.XmlElement[] anyField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute()]
        public System.Xml.XmlElement[] Any 
            get 
                return this.anyField;
            
            set 
                this.anyField = value;
            
        
    

我在 DocType 类上遇到重复属性错误,因为 XSD.exe 将所有导入的类型声明为部分类,并且由于其他早期的 XSD 导入,DocType 已经存在于同一命名空间中。我只是将它的命名空间更改为 Example.Imports.Orders 所以这个命名空间下只有 DocType。我希望这能说明问题和可能的解决方法。

【讨论】:

以上是关于xsd.exe 在 OFX2 架构上运行时生成重复的属性的主要内容,如果未能解决你的问题,请参考以下文章

使 xsd.exe 实用程序生成具有强类型的架构

XSD.exe 自动在关联属性的 setter 中设置生成的指定字段

让 xsd.exe 生成俄罗斯娃娃风格的文件

在构建期间自动化 xsd.exe

多个 xsd 文件的 xsd.exe 类生成器问题

使用 XSD.exe 的多个版本 C# 类/XSD