XML-массив Сериализация с различными типами без идентификатора «родительского» массива - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь сериализовать (прочитать) XML в мой проект. Я не могу изменить этот XML, потому что он создан не мной. Я постараюсь максимально упростить это.

Я хотел бы прочитать массив с несколькими типами в нем. Это не проблема, если элементы находятся внутри тега [XmlArray ("")]. Один из типов может содержать дополнительные массивы с такими же типами

Например:

Xml

<node Name="testbase">
    <items>
        <node Name="test1"/>
            <items>
                <node Name="test2"/>
                <node Name="test3"/>
            </items>
        <othernode Name="test4"/>   
    </items>
</node>

C #

public class Base
{
    [XmlAttribute("Name")]
    public string Name { get; set; }
}

public class Node : Base
{
    [XmlArray("items")]
    [XmlArrayItem("node", typeof(Node))]
    [XmlArrayItem("othernode", typeof(Othernode))]
    public Base[] nodes { get; set; }
}

public class Othernode : Base
{
}

К сожалению, у меня есть что-то вроде этого:

<node Name="testbase">
    <node Name="test1">
        <node Name="test2"/>
        <node Name="test3"/>    
    </node>
    <othernode Name="test4"/>   
</node>

Элементы массива "отсутствуют". Обычно я просто использую тег [XmlElemtn ("")] для подобных вещей.

[XmlElement("node")]
public List<Node> Nodes { get; set; }

Но больше невозможно использовать тег XmlArrayItem для разных типов. Обходной путь - просто использовать несколько списков / массивов, например:

public class Vendor : CreateBase
{
    [XmlElement("node")]
    public List<Node> Nodes { get; set; }

    [XmlElement("othernode")]
    public List<Othernode> Othernodes { get; set; }
}

Но я бы хотел, чтобы все было в одном списке / массиве. Возможно ли это каким-либо образом, если вы используете этот вид сериализации XML? Есть ли способ работы с шаблонами?

С уважением

1 Ответ

0 голосов
/ 05 сентября 2018

Если другие люди найдут эту ветку и попытаются сделать то же самое: Есть путь через абстрактные классы, [XmlInclude (typeof ())] и [XmlElement ("")] , но он добавляет новый атрибут к самому элементу xml. Например, вот так p3: type = "XmlDerivedClass" .
Если вы хотите сериализовать массивы xml с различными типами без использования [XmlArrayItem ("node", typeof (Node))] * (который добавляет дополнительный элемент массива в xml), вы можете сделать это через XmlInclude.

Как упомянуто в комментариях, похоже, что другого пути нет, и именно так оно и работает. Из-за моих требований, что я никак не могу изменить xml, я сделаю это вручную через XmlDocument или XmlReader.

...