2011-07-29 164 views
1

我面臨着一個讓我壞XML序列化陣列C#

<items> 
<name ="something 1" /> 

<subitems> 
<name ="sub something1" /> 
<item name="item 1" /> 
<item name="item 2" /> 
<item name="item 3" /> 
<someOtherTag name="Come On Really"> 
</subitems> 

</items> 

我curently序列化的對象,我想出了把我的這個循環的最後一個結構。我真的想在子項目上使用xmlarray屬性,但額外的名稱標籤讓我失望。有任何想法嗎?我正在尋找專門的C#反序列化。

+1

你可以發佈一個有效的XML的問題了嗎? 無效(格式錯誤)。 – carlosfigueira

回答

0

這不是真正有效的xml開始。

您應該在您的重複系列項目周圍放置<項目>標籤。

另外,嘗試使用的.Net串行內置:

The easiest way to populate a collection from XML file in .NET

+0

看起來對我有效(不是很好),除了未封閉的 gangelo

+0

重複節點並不遵循以下基本概念:http://download.oracle.com/docs/cd/E14981-01/wli/docs1031 /dttutorial/tutWLIDataTransExtraRepeat.html#wp1050355我很想看到這個模式。 –

+0

誰再使用模式;) – gangelo

3

由於張貼您的XML是無效的,我們需要把它有效的第一。如果無法解析,則無法反序列化。如果這個「XML」來自外部來源,他們需要首先爲您提供一個語法上有效的XML文檔。如果「XML」是由您控制的東西生成的,您需要修復它。

下面是語法上有效的XML相似標記的一對夫婦的形式,並且僅僅使用簡單的屬性更通過XML序列化容易序列化:

  • 選項1:

    <items name ="something 1" > 
        <subitems name ="sub something1" > 
        <item name="item 1" /> 
        <item name="item 2" /> 
        <item name="item 3" /> 
        <someOtherTag name="Come On Really" /> 
        </subitems> 
    </items> 
    

    對於這個選項,這裏的一個類,將序列化/反序列化上述標記(應該注意,正如他們在Perl世界中所說的,「TMTOWTDI」(有做)不止一種方法:

    [XmlRoot("items")] 
        public class Widget 
        { 
    
        [XmlAttribute("name")] 
        public string Name { get ; set ; } 
    
        [XmlElement("subitems")] 
        public SubWidget SubItems { get ; set ; } 
    
        public class SubWidget 
        { 
    
         [XmlAttribute("name")] 
         public string Name { get ; set ; } 
    
         [XmlElement("item")] 
         public Element[] Item { get ; set ; } 
    
         [XmlElement("someOtherTag")] 
         public Element SomeOtherTag { get ; set ; } 
    
         public class Element 
         { 
    
         [XmlAttribute("name")] 
         public string Name { get ; set ; } 
    
         } 
    
        } 
    
        } 
    
  • 選項2:

    <items> 
        <name>something 1</name> 
        <subitems> 
        <name>sub something1</name> 
        <item name="item 1" /> 
        <item name="item 2" /> 
        <item name="item 3" /> 
        <someOtherTag name="Come On Really" /> 
        </subitems> 
    </items> 
    

    再次,,將序列化/ deseraliaze此標記幾乎是相同的第一種情況。我們所要做的就是改變從XmlAttribute兩個屬性來XmlElement,即:

    [XmlRoot("items")] 
    public class Widget 
    { 
    
        [XmlElement("name")] // was XmlAttribute 
        public string Name { get ; set ; } 
    
        [XmlElement("subitems")] 
        public SubWidget SubItems { get ; set ; } 
    
        public class SubWidget 
        { 
    
        [XmlElement("name")] // was XmlAttribute 
        public string Name { get ; set ; } 
    
        [XmlElement("item")] 
        public Element[] Item { get ; set ; } 
    
        [XmlElement("someOtherTag")] 
        public Element SomeOtherTag { get ; set ; } 
    
        public class Element 
        { 
    
         [XmlAttribute("name")] 
         public string Name { get ; set ; } 
        } 
    
        } 
    
    }