【问题标题】:Microsoft.Net XSD.exe Tool, Creating Instantiated Classes, and XMLSerializationMicrosoft.Net XSD.exe 工具、创建实例化类和 XMLSerialization
【发布时间】:2018-04-30 22:29:12
【问题描述】:

我有一个 XML Schema 文件 (xsd),它序列化为一个文件,这正是我需要该文件的外观和行为方式。但是,我想要的是要实例化的顶级元素,特别是 Header。现在,XSD.exe 生成的源代码只是为我提供了一个作为 header 对象类型的“Header”属性,但它没有被实例化。

使用 System.XML.Serialization 专门用于将对象从 XML 文件序列化为类型化对象。

所以基本上,如果我尝试...

MyDoc.Header.HeaderField1 = "My value";

我得到一个空引用错误。

我必须...

MyDoc.Header = new MyApplication.Models.MyDoc.Header();
MyDoc.Header.HeaderField1 = "My value";

我希望能够简单地让 XSD.exe 工具生成 Header 对象,并在 Header 属性中,从 bat 开始将值设置为 = new Header()。

没什么大不了的,很容易解决,但可以更整洁。 :-p

这基本上是我拥有的架构。

<?xml version="1.0" encoding="utf-8"?>
<!-- 
xsd MyDoc.xsd /c /n:MyApplication.Models
-->
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="MyDoc">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Header">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="HeaderField1" type="xsd:string" />
              <xsd:element name="HeaderField2" type="xsd:string" />
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="Items">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element maxOccurs="unbounded" name="Item">
                <xsd:complexType>
                  <xsd:sequence>
                      <xsd:element name="Field1" type="xsd:string" />
                      <xsd:element name="Field2" type="xsd:string" />
                      <xsd:element name="Field3" type="xsd:string" />
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xs:schema>

【问题讨论】:

    标签: xml visual-studio xsd schema xsd.exe


    【解决方案1】:

    我发现解决这个问题的最佳方法是在代码中为 MyDoc 添加一个新的部分类。

    所以我最终得到了 XSD.exe 创建的生成的 C# MyDoc.cs 文件。然后我创建了一个名为 MyDocPartial.cs 的新类文件。这样看来……

    namespace MyApplication.Models
    {
        public partial class MyDoc
        {
    
            public MyDoc()
            {
                this.Header = new MyDocHeader();
            }
    
    
        }
    }
    

    有一个由 XSD.exe 生成的单独的 Partial Class MyDoc。但是它没有定义的构造函数。想我只是在这里放屁,但也想我会为其他人分享。 :)

    请注意,这个部分类也是我放入所有字段映射代码的地方,用于简化添加项目的代码等。全脑放屁。希望能帮助到你。 :)

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 2020-12-05
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多