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]

要除去xsixsd名称空间,请创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提供了一个回复,告诉你如何消除命名空间。