2009-10-29 112 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文件,我想。