Десериализовать XML с помощью XmlSerializer, где родительский и дочерний теги имеют одинаковый тег - PullRequest
0 голосов
/ 25 октября 2018

У меня проблемы с анализом строки XML, в которой родительский и дочерний узлы имеют одинаковые имена тегов.Очевидно, я мог бы заменить теги open / close пустыми строками и разобрать с кодом ниже, но это не элегантно.

Я искал и вижу, что есть ответы на то, как сделать это с XDocument, ноЯ специально хотел бы сделать это с XmlSerializer (если возможно).

Ниже приведен минимальный воспроизводимый пример.

Пример XML:

<AddJob>
    <AddJob RequestStatus="OK" RequestMessage="Job successfuly added [testPrintServer.tif, PES_Carpet_16C_76.2 x 50.8 dpi_170517_Normal]" UUID="74ad5971-7baf-49ce-b85b-ee08188d5721" />
</AddJob>

Код синтаксического анализа:

public class XmlHelper
{
    public static T Deserialize<T>(string xml)
    {
        var serializer = new XmlSerializer(typeof(T));

        T result;
        using (var reader = new StringReader(xml))
        {
            result = (T)serializer.Deserialize(reader);
        }
        return result;
    }
}

Модель данных:

[XmlRoot("AddJob")]
public class AddJob
{
    [XmlAttribute]
    public string RequestStatus { get; set; }

    [XmlAttribute]
    public string RequestMessage { get; set; }

    [XmlAttribute("UUID")]
    public string RipJobId { get; set; }
}

Телефонный код:

var addedJobResponse = XmlHelper.Deserialize<AddJob>(exampleXml);

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вложенные элементы AddJob выглядят как массив, и у вас не может быть массива в корне.Поэтому добавьте класс Root, как показано ниже:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication75
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
           string xml = "<AddJob>" +
              "<AddJob RequestStatus=\"OK\" RequestMessage=\"Job successfuly added [testPrintServer.tif, PES_Carpet_16C_76.2 x 50.8 dpi_170517_Normal]\" UUID=\"74ad5971-7baf-49ce-b85b-ee08188d5721\" />" +
              "</AddJob>";
           Root job = XmlHelper.Deserialize<Root>(xml);

        }

    }
    public class XmlHelper
    {

        public static T Deserialize<T>(string xml)
        {
            var serializer = new XmlSerializer(typeof(T));

            T result;
            using (var reader = new StringReader(xml))
            {
                result = (T)serializer.Deserialize(reader);
            }
            return result;
        }
    }
    [XmlRoot("AddJob")]
    public class Root
    {
        public AddJob AddJob { get; set; }
    }
    public class AddJob
    {
        [XmlAttribute]
        public string RequestStatus { get; set; }

        [XmlAttribute]
        public string RequestMessage { get; set; }

        [XmlAttribute("UUID")]
        public string RipJobId { get; set; }
    }



}
0 голосов
/ 25 октября 2018

Ваша модель данных не соответствует вашей структуре XML.

Пожалуйста, используйте что-то вроде этого:

[XmlRoot("AddJob")]
public class AddJob
{
    [XmlElement(ElementName = "AddJob")]
    public List<NestedAddJob> AddJobs { get; set; }
}

public class NestedAddJob
{
    [XmlAttribute]
    public string RequestStatus { get; set; }

    [XmlAttribute]
    public string RequestMessage { get; set; }

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