XML序列化 – 禁止渲染数组的根元素
我可以以某种方式禁用集合的根元素的呈现?
这个具有序列化属性的类:
[XmlRoot(ElementName="SHOPITEM", Namespace="")] public class ShopItem { [XmlElement("PRODUCTNAME")] public string ProductName { get; set; } [XmlArrayItem("VARIANT")] public List<ShopItem> Variants { get; set; } }
生成这个XML:
<SHOPITEM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <PRODUCTNAME>test</PRODUCTNAME> <Variants> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </Variants> </SHOPITEM>
这里我不需要<Variants>
元素。 我必须做什么?
此外,我不需要根元素中的xsi和xsd命名空间…
要禁止呈现集合的根元素,必须用代码中的[XmlElement]
replace属性[XmlArrayItem]
。
要除去xsi
和xsd
名称空间,请创build一个空名称空间的XmlSerializerNamespaces
实例,并在需要序列化对象时传递它。
看看这个例子:
[XmlRoot("SHOPITEM")] public class ShopItem { [XmlElement("PRODUCTNAME")] public string ProductName { get; set; } [XmlElement("VARIANT")] // was [XmlArrayItem] public List<ShopItem> Variants { get; set; } } // ... ShopItem item = new ShopItem() { ProductName = "test", Variants = new List<ShopItem>() { new ShopItem{ ProductName = "hi 1" }, new ShopItem{ ProductName = "hi 2" } } }; // This will remove the xsi/xsd namespaces from serialization XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer ser = new XmlSerializer(typeof(ShopItem)); ser.Serialize(Console.Out, item, ns); // Inform the XmlSerializerNamespaces here
我得到这个输出:
<?xml version="1.0" encoding="ibm850"?> <SHOPITEM> <PRODUCTNAME>test</PRODUCTNAME> <VARIANT> <PRODUCTNAME>hi 1</PRODUCTNAME> </VARIANT> <VARIANT> <PRODUCTNAME>hi 2</PRODUCTNAME> </VARIANT> </SHOPITEM>
用[XmlElement("VARIANT")]
replace[XmlArrayItem("VARIANT")]
[XmlElement("VARIANT")]
。
我不相信有可能使用默认的XML序列化(使用属性)删除此元素。 如果你能做到这一点,那么序列化你的ShopItem
类将导致forms严重的xml(没有根元素)的对象,这是不允许的。
你可以做什么,但是,手动实现IXmlSerializable
。 这会给你一种细致的控制,你以后。
[ 编辑 ] – 抱歉 – 误读您试图删除变体,而不是SHOPITEM。 要删除List“outer”元素,只需使用[XmlElement]属性而不是[XmlArrayItem]属性标记它即可。 这将导致列表条目只使用指定的元素名称,而不将该列表包装在外部元素中。
为了除去命名空间,这是由seriliazer本身,而不是在类的标记控制。 我刚刚注意到,虽然我已经更新了这个答案,Rubens Farias提供了一个回复,告诉你如何消除命名空间。