Как определить элемент массива строк для узла cdata в xml x # - PullRequest
0 голосов
/ 06 февраля 2020

Мне нужно сериализовать класс в XML, который выглядит как

<Dummy>
  <Definition>
  </Definition>
  <Example><![CDATA[0401010101010101]]></Example>
  <Example><![CDATA[0401010101010101]]></Example>
  <Example><![CDATA[0401010101010101]]></Example>      
</Dummy>

Количество «Примерных» узлов может варьироваться от 3 до n узлов. Поэтому мне нужно определить его как строковый массив в моем классе xml. Как должен выглядеть мой класс ???

Я видел в сети пример для строки:

[XmlIgnore]
public string Example { get; set; }

[XmlElement("Example")]
public System.Xml.XmlCDataSection MyStringCDATA
{
    get
    {
        return new System.Xml.XmlDocument().CreateCDataSection(Example);
    }
    set
    {
        Example = value.Value;
    }
}

Но у меня есть строковый массив.

Как мне определить это?

1 Ответ

0 голосов
/ 07 февраля 2020

Это единственный класс, который вам нужно прочитать в списке строк (пример).

[XmlRoot(ElementName = "Dummy")]
public class Dummy
{
    [XmlElement(ElementName = "Definition")]
    public string Definition { get; set; }
    [XmlElement(ElementName = "Example")]
    public List<string> Example { get; set; }
}

Использование:

XmlSerializer serializer = new XmlSerializer(typeof(Dummy));
Dummy obj = (Dummy)serializer.Deserialize(new StreamReader(filename));
List<string> examples = obj.Example;
examples.ForEach(x => Console.WriteLine(x));

Вывод

0401010101010101
0401010101010101
0401010101010101

Альтернативный

Если вы хотите получить полное значение в примере, у вас будет сделать что-то вроде этого. Причина заключается в том, что значения заключены в <>, что делает значение элементом (без конечного тега).

XDocument xdoc = XDocument.Parse(xmlString);
var objects = xdoc.Root.Elements().Where(x => x.Name.ToString().Equals("Example")).ToList();
objects.ForEach(x => Console.WriteLine(x.FirstNode.ToString()));

, который выдает:

<![CDATA[0401010101010101]]>
<![CDATA[0401010101010101]]>
<![CDATA[0401010101010101]]>
...