Сериализация 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 пространства имен в корневом элементе...

115
задан Luke Girvin 19 April 2016 в 14:30
поделиться

3 ответа

Чтобы отключить отрисовку корневого элемента коллекции, вы должны заменить в вашем коде атрибут [XmlArrayItem] на [XmlElement].

Для удаления пространств имен xsi и xsd создайте экземпляр 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>
176
ответ дан 24 November 2019 в 02:26
поделиться

Замените [XmlArrayItem("VARIANT")] на [XmlElement("VARIANT")].

.
32
ответ дан 24 November 2019 в 02:26
поделиться

Я не считаю возможным удалить этот элемент, используя сериализацию xml по умолчанию (с атрибутами). Если бы Вы могли это сделать, то сериализация Вашего класса ShopItem привела бы к плохому формированию xml (без корневого элемента) для объекта, что запрещено.

Однако, Вы можете вручную реализовать IXmlSerializable. Это позволит Вам получить тонкозернистый контроль, который Вы получите после.

.

[Edit] - Простите - неправильно поняли, что вы пытались удалить Варианты, а не ШОПИТЕМУ. Чтобы удалить "внешний" элемент списка, просто пометьте его атрибутом [XmlElement], а не атрибутом [XmlArrayItem]. Это приведет к тому, что списки будут просто использовать указанное имя элемента, не обертывая список во внешний элемент.

Для удаления именных пространств, это управляется самим серилизатором, а не разметкой на классе. Я только что заметил, что пока я обновлял этот ответ, Рубенс Фариас предоставил ответ, в котором показано, как удалить пространство имён.

.
1
ответ дан 24 November 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: