Установить значение узла XML в качестве поля модели C # при десериализации XML - PullRequest
0 голосов
/ 23 апреля 2019

Я ищу правильную десериализацию некоторого XML.

Часть XML выглядит следующим образом:

<Keys>
    <Key>
        <Name>Test 1</Name>
        <KeyValues>
            <KeyValue Offered="true" Order="1">One</KeyValue>
            <KeyValue Offered="true" Order="2">Two</KeyValue>
            <KeyValue Offered="true" Order="3">Three</KeyValue>
            <KeyValue Offered="true" Order="4">Four</KeyValue>
        </KeyValues>                            
    </Key>                      
    <Key>
        <Name>Test 2</Name>
        <KeyValues>
            <KeyValue Offered="true">One</KeyValue>
        </KeyValues>                            
    </Key>
</Keys>

, и я хотел бы десериализовать каждое KeyValue из этого в объект C #, которыйвыглядит следующим образом:

public class KeyValue
{
    public string Value { get; set; }

    [XmlAttribute]
    public int Order { get; set; }

    [XmlAttribute]
    public bool Offered { get; set; }
}

Это (примерно) код, который я использую для десериализации:

XmlSerializer serializer = new XmlSerializer(typeof(MyObject));

using (TextReader reader = new StringReader(xml))
{
    myObject = (MyObject)serializer.Deserialize(reader);
}

Это почти правильно работает.Не выдается никаких исключений, и Order и Offered заданы правильно, но я бы хотел, чтобы One, Two, Three и т. Д. Из KeyValues ​​в моем XML-коде входили в поле Value в моей модели.

Возможно ли это?Если да, то как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Посмотрев на этот сайт за комментарий Роберта Харви, я понял, что мне не хватало атрибута [XmlText] над моим полем Value.Я добавил это, проверил, и это сработало.

0 голосов
/ 23 апреля 2019

Я бы не использовал сериализацию в этом случае, потому что это потребовало бы моих классов, а не других методов. См. Решение xml linq ниже:

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

namespace ConsoleApplication110
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<Key> keys = doc.Descendants("Key").Select(x => new Key()
            {
                Name = (string)x.Element("Name"),
                Values = x.Descendants("KeyValue").Select(y => new KeyValue() {
                    Value = (string)y,
                    Offered = (bool)y.Attribute("Offered"),
                    Order  = (int?)y.Attribute("Order")
                }).ToList()
            }).ToList();
        }

    }
    public class Key
    {
        public string Name { get; set; }
        public List<KeyValue> Values { get;set;}
    }
    public class KeyValue
    {
        public string Value { get; set; }
        public int? Order { get; set; }
        public bool Offered { get; set; }
    }



}
...