XmlSerializer没有填充子元素

时间:2009-10-29 19:20:24

标签: c# xml-serialization xsd.exe

我已经使用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未包含的一些提示或其他内容?

3 个答案:

答案 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文件中的某些内容并不完全正确。