Помогите с созданием объекта из XML-данных с вложенными элементами - PullRequest
0 голосов
/ 13 марта 2011

У меня есть этот xml:

<stop>
<code>2222222</code>
<code_short>E2217</code_short>
<name_fi>Konemies</name_fi>
<name_sv>Maskinbyggaren</name_sv>
<city_fi>Espoo</city_fi>
<city_sv>Esbo</city_sv>
<lines>
  <node>2010  1:Puolarmetsä</node>
  <node>2010K 1:Puolarmetsä</node>
  <node>2052  2:Hämevaara</node>
  <node>2103  1:Pohjois-Tapiola</node>
  <node>2103T 1:Pohjois-Tapiola</node>
  <node>2506  1:Pohjois-Tapiola</node>
  <node>2512A 2:Malmin asema</node>
  <node>2550  2:Itäkeskus, lait. 22</node>
  <node>5510  2:Vantaankoski</node>
</lines> </stop>

Я хочу использовать LINQ для создания списка

, где Стоп:

public class Stop
{
    public string code { get; set; }
    public string shortCode { get; set; }
    public string name { get; set; }
    public string city { get; set; }

    public IList<string> lines { get; set; }

    public Stop()
    {
        lines = new List<string>();
    }
}

Как мне добиться этого с помощью LINQ?

Этот LINQ дает мне список остановок

        XDocument xdoc = XDocument.Load("test.xml");

        var stop = (from node in xdoc.Element("response").Elements("node")
                    select new Stop
                    {
                        code = node.Element("code").Value,
                        shortCode = node.Element("code_short").Value,
                        name = node.Element("name").Value,
                        city = node.Element("city").Value
                    });

Но как мне справиться со строками? Идеи? Предложения?

1 Ответ

2 голосов
/ 13 марта 2011

Примерно так:

XDocument xdoc = XDocument.Load("test.xml");

var stop = (from node in xdoc.Descendants("stop")
            select new Stop
            {
                code = node.Attribute("code").Value,
                shortCode = node.Attribute("code_short").Value,
                name = node.Attribute("name").Value,
                city = node.Attribute("city").Value,
                lines = node.Element("lines")
                            .Elements("node")
                            .Select(x => (string) x)
                            .ToList()
            });

Приведенный выше код также демонстрирует альтернативный способ преобразования XElement в строку - использование приведения вместо свойства .Value. Если XElement равно нулю, результат приведения будет нулевым, тогда как результат .Value будет исключением. Если допустимо отсутствие элемента, использование .Value хорошо, потому что это вызовет ошибку, как только будут обнаружены неверные данные; для «необязательных» элементов приведение является простым способом допустить пропущенные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...