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 名称空间..。

63352 次浏览

我认为不可能使用默认的 xml 序列化(带有属性)删除这个元素。如果可以这样做,那么序列化 ShopItem类将导致对象的 xml 格式不正确(没有根元素) ,这是不允许的。

但是,您可以手动实现 IXmlSerializable。这将给你一种细粒度的控制你后。

[ 剪辑]-对不起-误解了你是想删除变种,而不是 SHOPITEM。要删除 List“ out”元素,只需使用[ XmlElement ]属性而不是[ XmlArrayItem ]属性标记它。这将导致列表条目只使用指定的元素名称,而不将列表包装在外部元素中。

对于删除名称空间,这是由 seriliazer 本身控制的,而不是类上的标记。 我刚刚注意到,当我更新这个答案时,Rubens Farias 提供了一个答案,向您展示了如何消除名称空间。

若要禁用呈现集合的根元素,必须在代码中将属性 [XmlArrayItem]替换为 [XmlElement]

为了删除 xsixsd名称空间,创建一个具有空名称空间的 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")]代替 [XmlArrayItem("VARIANT")]