我已经使用XSD.EXE将XSD转换为对象。这工作正常,我可以使用XMLSerializer进行反序列化,除了生成为数组的子元素不会填充。
private SubElements[] subelementsField;
/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("SubElement", IsNullable=false)]
public SubElement[] SubElement {
get {
return this.subelementField;
}
set {
this.subelementField = value;
}
}
即使XML中有数据,当我使用以下代码时,它也不会填充它:
// Deserialize
var result = serializer.Deserialize(new StringReader(data.XMLText.ToString()));
根元素都可以正常工作,而不是这种XML数据的子元素:
<RootNode Weight="205" Year="1995">
<ParentNodeWhichWorksFine Contact="John Doe">
<SubElement SomeAttribute="123">
<Location>New York City</Location>
<Team>New York Pizza</Team>
</SubElement>
</ParentNodeWhichWorksFine>
</RootNode>
我是否遗漏了XSD.EXE未包含的一些提示或其他内容?
答案 0 :(得分:5)
我假设您定义属性SubElement
的类是与ParentNodeWhichWorksFine
对应的类?如果是这样,请尝试此更改:
[XmlElement("SubElement", IsNullable=false)]
public SubElement[] SubElement
另外,您说您已使用xsd.exe生成此代码。在那种情况下输入是什么 - .xsd文件?如果是这样,你也可以发布它的相关部分吗?
答案 1 :(得分:1)
XmlArrayItemAttribute
属性指定公共成员SubElements
定义的数组元素的子节点的名称。所以xml样本不符合xsd,如果这是xsd.exe生成的确切类。
根据生成的类,<SubElement>
项应该包含在父<SubElements>
节点中,如下所示:
<RootNode Weight="205" Year="1995">
<ParentNodeWhichWorksFine Contact="John Doe">
<SubElements>
<SubElement SomeAttribute="123">
<Location>New York City</Location>
<Team>New York Pizza</Team>
</SubElement>
</SubElements>
</ParentNodeWhichWorksFine>
</RootNode>
如果您可以控制架构,我认为更改它以使其对应于示例xml是优选的(没有父节点,在Pavel's solution之后),因为父阵列节点是多余的。
答案 2 :(得分:1)
看起来您生成的类中的SubElement数组缺少[XmlArray]属性。
它需要看起来像这样:
[System.Xml.Serialization.XmlArrayAttribute("SubElements")]
[System.Xml.Serialization.XmlArrayItemAttribute("SubElement", IsNullable=false)]
public SubElement[] SubElement {
}
我认为XSD文件中的某些内容并不完全正确。