干净的 XML 序列化分层、递归数据结构

2023-12-05

我有这门课:

[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 为:

<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>

So, MenuItem都是root子元素。作为根,它被序列化为menuItem有适当的外壳。但是,作为子元素,它的大小写不正确。我怎样才能让序列化器创建menuItem并不是MenuItem在子项目的输出中。区分大小写对我来说很重要。

我试着把[XmlElement]类本身的属性,但出现以下错误:

属性“XmlArrayItem”在此声明类型上无效。这是 仅对“属性、索引器、字段、参数、返回”声明有效。

另外,我不希望那里有那些默认名称空间,并且我不希望将子项创建为空元素。最终的 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>

我应该使用什么属性?


Add 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

干净的 XML 序列化分层、递归数据结构 的相关文章

随机推荐