XML序列化-禁用呈现数组的根元素


119

我可以以某种方式禁用集合根元素的渲染吗?

此类具有序列化属性:

[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命名空间...


Answers:


184

要收集的根元素的渲染禁用,则必须更换属性[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>

请注意,[XmlArray]如果存在,还必须更换。
dbc


1

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

但是,您可以手动执行IXmlSerializable。这将为您提供一种细粒度的控制,让您可以重新控制。

[ 编辑 ]-对不起-误读了您要删除变体而不是商店的信息。要删除列表的“外部”元素,只需使用[XmlElement]属性而不是[XmlArrayItem]属性对其进行标记。这将导致列表条目仅使用指定的元素名称,而不会将列表包装在外部元素中。

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


糟糕-看错了您的帖子-以为您正在尝试删除SHOPITEM-只是编辑答案!
罗布·莱文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.