2009-10-29 97 views
1

我已经使用XSD.EXE将XSD转换为对象。这工作正常,我可以反序列化使用XMLSerializer就好了,除了作为数组生成的子元素不填充。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未包含的其他内容?

回答

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之后)。

+0

原来,源XML(SubElements)中没有包含标签。非常感谢。 – 2009-10-29 20:04:52

5

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

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

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

+0

非常感谢,你救了我的一天。 – 2011-01-03 09:40:12

1

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

它必须看起来像这样:

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

东西是不完全正确在你的XSD文件,我想。