Sae*_*ati 3 .net c# xml serialization xml-serialization
我有这门课:
[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; }
}
Run Code Online (Sandbox Code Playgroud)
其中定义了菜单层次结构.现在,在序列化此类时,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>
Run Code Online (Sandbox Code Playgroud)
所以,MenuItem是root和child元素.作为根,它的序列化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>
Run Code Online (Sandbox Code Playgroud)
我应该使用什么属性?
添加XmlArrayItemAttribute并删除IsNullable:
[XmlArray("items"), XmlArrayItem("menuItem")]
public List<MenuItem> Items { get; set; }
Run Code Online (Sandbox Code Playgroud)
要摆脱额外的命名空间,您需要使用XmlSerializerNamespaces:
var ns = new XmlSerializerNamespaces();
ns.Add("","");
var ser = new XmlSerializer(typeof (MenuItem));
ser.Serialize(Console.Out, obj, ns);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3192 次 |
| 最近记录: |