XML序列化 - 禁用渲染数组的根元素

Jan*_*nda 115 c# serialization attributes

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

此类具有序列化属性:

[XmlRoot(ElementName="SHOPITEM", Namespace="")]
public class ShopItem
{
    [XmlElement("PRODUCTNAME")]
    public string ProductName { get; set; }       

    [XmlArrayItem("VARIANT")]
    public List<ShopItem> Variants { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

生成这个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>
Run Code Online (Sandbox Code Playgroud)

我不想要<Variants>元素.我必须做什么?

另外我在根元素中不需要xsi和xsd命名空间...

Rub*_*ias 176

要禁止收集的根元素的渲染,则必须更换属性[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
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出:

<?xml version="1.0" encoding="ibm850"?>
<SHOPITEM>
  <PRODUCTNAME>test</PRODUCTNAME>
  <VARIANT>
    <PRODUCTNAME>hi 1</PRODUCTNAME>
  </VARIANT>
  <VARIANT>
    <PRODUCTNAME>hi 2</PRODUCTNAME>
  </VARIANT>
</SHOPITEM>
Run Code Online (Sandbox Code Playgroud)


Pen*_*puu 32

替换[XmlArrayItem("VARIANT")][XmlElement("VARIANT")].