簡體   English   中英

清理XML序列化分層遞歸數據結構

[英]Clean XML serializing a hierarchical, recursive data structure

我有這門課:

[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; }
}

其中定義了菜單層次結構。 現在,在序列化此類時,3級菜單的輸出XML是:

<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]屬性放在類本身上,但是出現了以下錯誤:

屬性“XmlArrayItem”在此聲明類型上無效。 它僅對'property,indexer,field,param,return'聲明有效。

此外,我不希望那些默認命名空間,我不希望子項創建為空元素。 最終的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>

我應該使用什么屬性?

添加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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM