Xml linq. Как обратиться к следующему узлу?

108
21 октября 2021, 05:20

Структура XML-файла:

<?xml version="1.0" encoding="UTF-8" ?>
<employees>
    <employee>
        <fio>Карпов</fio>
        <date>10.09.1978</date>
        <home>11 А Победа</home>
        <phone>87509708898</phone>
    </employee>  
    <list_work>
        <work>
            <name>ЖЭК</name>
            <date_start>10.09.2001</date_start>
            <date_end>10.09.2004</date_end>
        </work>
        <work>
            <name>Маркетинг</name>
            <date_start>11.04.2005</date_start>
            <date_end>10.12.2011</date_end>
        </work>
    </list_work>
    <list_pay>
        <pay>
            <year>2004</year>
            <month>09</month>
            <salary>75000</salary>
        </pay>
        <pay>
            <year>2007</year>
            <month>07</month>
            <salary>250000</salary>
        </pay>
    </list_pay>
    <employee>
    <fio>Глухарь</fio>
    <date>02.12.1981</date>
    <home>12 Б Минусинская</home>
    <phone>87509708881</phone>
<list_work>
    <work>
        <name>Рекламный агент</name>
        <date_start>10.03.2011</date_start>
        <date_end>05.09.2014</date_end>
    </work>
    <work>
        <name>F1</name>
        <date_start>11.04.2016</date_start>
        <date_end>08.10.2018</date_end>
    </work>
</list_work>
<list_pay>
    <pay>
        <year>2012</year>
        <month>06</month>
        <salary>56000</salary>
    </pay>
    <pay>
        <year>2015</year>
        <month>12</month>
        <salary>550000</salary>
    </pay>
</list_pay>
</employee> 
</employees>

Мне нужно выбрать фамилию, адрес и название работы и загрузить эту информацию в listView.

xDoc = XDocument.Load("worker.xml");
            IEnumerable<XElement> workers = xDoc.Elements();
            foreach (XElement worker in workers.Elements())
            {
                listView1.Items.Add(worker.Element("fio").Value);
                listView1.Items[worker.Items.Count - 1].SubItems.Add(worker.Element("home").Value);
                listView1.Items[listView1.Items.Count - 1].SubItems.Add(worker.Element("name").Value);
            }

Но когда я запускаю программу, выводится только фамилия и адрес и то только первая запись, а название работы вовсе нет.

Как сделать так чтобы выводил все записи, то есть фамилию и адрес, а также, чтоб выводил название работы ?

Answer 1

xml невалидный.
В одном случае узел list_work это самостоятельный узел, в другом — list_work вложен в узел employee.
На случай, если в документе узел list_work вложенный:

    XElement xelement = XElement.Load("worker.xml");
    foreach (var employee in xelement.Elements())
    {
        string[] arr = new string[3]
        {
          employee.Element("fio").Value,
          employee.Element("home").Value,
          ""
        };
        var works = employee.Element("list_work").Elements("work")
            .Select(work => work.Element("name").Value).ToList();
        if (works.Count > 0)
            arr[2] = works[0];
        listView1.Items.Add(new ListViewItem(arr));
        foreach (var item in works.Skip(1))
        {
            arr = new string[3] { "", "", item };
            listView1.Items.Add(new ListViewItem(arr));
        }
    }
READ ALSO
Управляемая 3D модель в C#.NET

Управляемая 3D модель в C#.NET

Прошу помочь в решении задачи: Есть некоторое количество 3-х мерных моделейТак же имеется несколько моделей управления, которые по начальным...

98
Изменение свойств обьекта

Изменение свойств обьекта

Я хочу изменить свойства обьекта

157
Есть ли в dot.net что-то для работы с сетевыми пакетами?

Есть ли в dot.net что-то для работы с сетевыми пакетами?

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

178
Пишу WCF сервис по запросам в Oracle

Пишу WCF сервис по запросам в Oracle

Есть кодМне необходимо чтобы клиент приложение в консоли выводило строки из БД Оракл

163