Как десериализовать список, чтобы получить значение элемента - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь протестировать 1 HTTP-запрос HTTP POST к моему веб-API, используя XML-код, подобный следующему:

<trx>
            <header>...</header>
            <body>
        <unity keycnt="4">
            <key param="param1"><![CDATA[value1]]</key>
            <key param="param2"><![CDATA[value2]]</key>
            <key param="param3"><![CDATA[value3]]</key>
            <key param="param4"><![CDATA[value4]]</key>
            </unity>
        </body>
        </trx>

Когда я десериализую этот запрос со списком классов, подобным этому:

 [Serializable()]
    [XmlRoot(ElementName="trx")]
    public class Trx {
        [XmlElement("header")]
        public Header Header { get; set;}
         [XmlElement("body")]
        public Body Body{ get; set;}
    }

Тело класса:

 [Serializable()]
    public class Body{
        [XmlElement("unity")]
        public Unity Unity{ get; set;}
    }

Класс Unity:

  [Serializable()]
        public class Unity{
            [XmlAttribute("keycnt")]
            public string keycnt{ get; set;}
       [XmlElement("key")]
            public List<Key> KeyList{ get; set;}
        }

Ключ класса:

  [Serializable()]
            public class Key{
                [XmlAttribute("param")]
                public string param{ get; set;}
            }

После десериализации я получаю все атрибуты, кромезначение элементов списка ключей. (значение1, значение2, значение3, значение4)

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Проверьте также, что вы вводите XML.Ваш XML поврежден.Здесь исправлено одно.Элемент CDATA отсутствовал> в конце.

<trx>
<header></header>
<body>
    <unity keycnt="4">
        <key param="param1"><![CDATA[value1]]></key>
        <key param="param2"><![CDATA[value2]]></key>
        <key param="param3"><![CDATA[value3]]></key>
        <key param="param4"><![CDATA[value4]]></key>
    </unity>
</body>

0 голосов
/ 20 декабря 2018

Вам нужно добавить еще одно свойство в ваш Key класс с типом данных string, и тогда ваш XmlSerializer даст вам десериализовать ваши значения внутри CDATA.

И украсить это свойство с помощью [XmlText].Этот атрибут может дать вам CDATA как текст в конкретном узле в xml.

Таким образом, ваш класс Key должен быть.

[Serializable()]
public class Key
{
    [XmlAttribute("param")]
    public string param { get; set; }
    [XmlText]
    public string Text { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...