我有一个XML Schema文件(xsd),它序列化到一个文件,这正是我需要文件的外观和行为。但是我想要的是一个顶级元素,特别是Header,要实例化。现在,XSD.exe生成的源代码只是为我提供了一个" 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>
答案 0 :(得分: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。但是它没有定义的构造函数。想想我只是在这里放屁,但也想到我会为其他人分享。 :)
注意,这个部分类也是我放入所有字段映射代码的地方,代码简化添加项目等。总脑屁。希望能帮助到你。 :)