2011-07-29 115 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 ; } 
        } 
    
        } 
    
    }