2

我使用 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 不包括的一些提示或其他内容?

4

3 回答 3

5

我假设您在其中定义属性的类SubElement是对应于ParentNodeWhichWorksFine? 如果是这样,请尝试以下更改:

[XmlElement("SubElement", IsNullable=false)]
public SubElement[] SubElement

另外,您说您已经使用 xsd.exe 生成了此代码。这种情况下的输入是什么 - 一个 .xsd 文件?如果是这样,您也可以发布它的相关部分吗?

于 2009-10-29T19:27:01.493 回答
1

XmlArrayItemAttribute属性指定由公共成员定义的数组元素的子节点SubElements的名称。因此,如果这正是生成的 xsd.exe 生成的类,那么该示例 xml 不符合 xsd。

根据生成的类,<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 的解决方案),因为父数组节点是多余的。

于 2009-10-29T19:39:13.480 回答
1

看起来您生成的类中的 SubElement 数组缺少 [XmlArray] 属性。

它需要看起来像这样:

[System.Xml.Serialization.XmlArrayAttribute("SubElements")]
[System.Xml.Serialization.XmlArrayItemAttribute("SubElement", IsNullable=false)]
public SubElement[] SubElement {
}

我认为您的 XSD 文件中有些地方不太对劲。

于 2009-10-29T19:44:26.730 回答