有如下的XML及反序列化对象。问题是我想把MenuItem中的children属性的首字母大写,即改成Children,但如果大写就无法反序列化出子节点,请问有什么方法可以搞定?
<?xml version="1.0" encoding="utf-8" ?> <menus> <menu name="a"> <children> <menu name="a1" /> <menu name="a2" /> <menu name="a3" /> </children> </menu> <menu name="b"> <children> <menu name="b1" /> <menu name="b2" /> <menu name="b3"> <children> <menu name="b31" /> <menu name="b32" /> <menu name="b33" /> </children> </menu> </children> </menu> </menus>
using System.Xml.Serialization; using System.Xml.Schema; [XmlRootAttribute(ElementName = "menus", Namespace = "", IsNullable = false)] public class MenuItems { [XmlElementAttribute("menu", Form = XmlSchemaForm.Unqualified)] public MenuItem[] Items { get; set; } } [XmlTypeAttribute(AnonymousType = true)] public class MenuItem { [XmlAttributeAttribute("name")] public string Name { get; set; } [XmlArrayItemAttribute("menu", typeof(MenuItem), Form = XmlSchemaForm.Unqualified, IsNullable = false)] public MenuItem[] children { get; set; } }
你可以把属性申明成大写开头,但是在 XmlElement 或 XmlArrayItem 里把序列化名称设置为小写开头。
高手,代码就在上面,麻烦给写下呗。我试了很多方法,都不行,要么编译不过,要么无法序列化。
[XmlArrayItemAttribute("menu", typeof(MenuItem), Form = XmlSchemaForm.Unqualified, IsNullable = false)] public MenuItem[] children { get; set; }
就这句,怎么改呢?
@沧海一杰: 简单的很:
[XmlArrayItemAttribute("menu", typeof(MenuItem), Form = XmlSchemaForm.Unqualified, IsNullable = false)]
[XmlArrayAttribute("children")]
public MenuItem[] Children { get; set; }
@Launcher: 高手,你终于出手了,果然如此,结贴给分。
改xml不行吗?反序列化之前是一个字符串吧?<children>替换为<Children>,</children>替换为</Children>?
我们公司的代码规范,xml属性名第一个单词小写,C#属性第一个单词大写。
@沧海一杰: 反序列化之前做一下替换啊,没让你把xml文件中的小写也替换掉啊
我怎么看你自己写的代码里面,把属性改为首字母大写完全可以正常运行的呀,你说“想把MenuItem中的children属性的首字母大写,即改成Children,但如果大写就无法反序列化出子节点”,这种情况根本不存在,你再试试看。
可以运行是可以运行,但Children=null,children就不会是null
@沧海一杰:
哦,没留意里面的属性值,不过其他人也给出答案了,你只要再添加
XmlArray的声明就可以了。
设置 要序列化的父节点和子节点 [XmlArray,XmlArrayItem]
[XmlArray("children"), XmlArrayItem("menu", typeof(MenuItem), Form = XmlSchemaForm.Unqualified, IsNullable = false)] public MenuItem[] Children { get; set; }