Можно как-то отключить рендеринг корневого элемента коллекции?
Этот класс с атрибутами сериализации:
[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 в корневом элементе ...
c#
serialization
attributes
Ян Ремунда
источник
источник
Ответы:
Чтобы отключить отображение корневого элемента коллекции, вы должны заменить атрибут
[XmlArrayItem]
на[XmlElement]
в своем коде.Для удаления
xsi
иxsd
пространств имен, создатьXmlSerializerNamespaces
экземпляр с пустым пространством имен и передать его , когда вам нужно сериализовать объект.Взгляните на этот пример:
Я получил такой вывод:
источник
[XmlArray]
если есть.Заменить
[XmlArrayItem("VARIANT")]
на[XmlElement("VARIANT")]
.источник
Я не верю, что можно удалить этот элемент, используя сериализацию xml по умолчанию (с атрибутами). Если бы вы могли это сделать, то сериализация вашего
ShopItem
класса привела бы к плохо сформированному xml (без корневого элемента) для объекта, что недопустимо.Однако вы можете реализовать это вручную
IXmlSerializable
. Это даст вам своего рода детальный контроль, который вам понадобится.[ Edit ] - извините - неправильно прочитали, что вы пытались удалить варианты, а не SHOPITEM. Чтобы удалить «внешний» элемент списка, просто пометьте его атрибутом [XmlElement], а не атрибутом [XmlArrayItem]. Это приведет к тому, что записи списка будут просто использовать указанное имя элемента, не заключая список во внешний элемент.
Удаление пространств имен контролируется самим серилиазером, а не разметкой класса. Я только что заметил, что, хотя я обновлял этот ответ, Рубенс Фариас предоставил ответ, в котором показано, как удалить пространство имен.
источник