2012-05-30 48 views
3

我有这个类:清洁XML序列化的层次,递归数据结构

[XmlRoot("menuItem")] 
public class MenuItem 
{ 
    [XmlAttribute("text")] 
    public string Text { get; set; } 

    [XmlAttribute("isLink")] 
    public bool IsLink { get; set; } 

    [XmlAttribute("url")] 
    public string Url { get; set; } 

    [XmlArray("items", IsNullable = true)] 
    public List<MenuItem> Items { get; set; } 
} 

它定义了一个菜单的层次结构。现在,在序列化这个类,输出XML为3级菜单是:

<menuItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
text="Tools" isLink="false"> 
    <items> 
    <MenuItem text="Market" isLink="false"> 
     <items> 
     <MenuItem text="Market Analyzer" isLink="true" url="/tools/market/analyzer"> 
      <items xsi:nil="true" /> 
     </MenuItem> 
     </items> 
    </MenuItem> 
    <MenuItem text="Banking" isLink="false"> 
     <items> 
     <MenuItem text="Purchase" isLink="true" url="/buy?type=good"> 
      <items xsi:nil="true" /> 
     </MenuItem> 
     </items> 
    </MenuItem> 
    <MenuItem text="General" isLink="false"> 
     <items> 
     <MenuItem text="Forecasts" isLink="true" url="/wheather-forcasts?city=la"> 
      <items xsi:nil="true" /> 
     </MenuItem> 
     </items> 
    </MenuItem> 
    </items> 
</menuItem> 

所以,MenuItem既是子元素。作为根,它被序列化为menuItem与适当的外壳。但是,作为子元素,它的大小写是不正确的。如何让子串项目在子项目的输出中创建menuItem而不是MenuItem。区分大小写在这里对我很重要。

我试图把[XmlElement]属性类本身,而是得到了以下错误:

Attribute 'XmlArrayItem' is not valid on this declaration type. It is only valid on 'property, indexer, field, param, return' declarations.

另外,我不希望这些默认命名那里,我不希望孩子项目被创建为空元素。最终的XML文件应该与此XML示例一样干净:

<menuItem text='Tools' isLink='false'> 
    <items> 
    <menuItem text='Market' isLink='false'> 
     <items> 
     <menuItem text='Market Analyzer' isLink='true' url='/tools/market/analyzer' /> 
     </items> 
    </menuItem> 
    <menuItem text='Banking' isLink='false'> 
     <items> 
     <menuItem text='Purchase' isLink='true' url='/buy?type=good' /> 
     </items> 
    </menuItem> 
    <menuItem text='General' isLink='false'> 
     <items> 
     <menuItem text='Forecasts' isLink='true' url='/wheather-forcasts?city=la' /> 
     </items> 
    </menuItem> 
    </items> 
</menuItem> 

我应该使用哪些属性?

回答

6

添加XmlArrayItemAttribute并带走ISNULLABLE:

[XmlArray("items"), XmlArrayItem("menuItem")] 
public List<MenuItem> Items { get; set; } 

为了摆脱额外的命名空间,你需要使用XmlSerializerNamespaces

var ns = new XmlSerializerNamespaces(); 
ns.Add("",""); 
var ser = new XmlSerializer(typeof (MenuItem)); 
ser.Serialize(Console.Out, obj, ns); 
+0

高兴的是,人们喜欢你是SO马克。谢谢 ;)。 –