XmlDocument - как получить все значения из нескольких узлов - PullRequest
0 голосов
/ 20 ноября 2018

Вот мой пример XML-файла:

<Main>
    <Person>
        <Name>Božena</Name>
        <Surname>Němcová</Surname>
        <Gender>Female</Gender>
        <OrderNum>18</OrderNum>
        <BirthDate>04.02.1820</BirthDate>
    </Person>
    <Person>
        <Name>Jan</Name>
        <Surname>Žižka</Surname>
        <Gender>Male</Gender>
        <OrderNum>7</OrderNum>
        <BirthDate>19.09.1360</BirthDate>
    </Person>
    <Person>
        <Name>Che</Name>
        <Surname>Guevara</Surname>
        <Gender>Male</Gender>
        <OrderNum>27</OrderNum>
        <BirthDate>14.06.1928</BirthDate>
    </Person>
    <Person>
        <Name>Antonie</Name>
        <Surname>de Saint-Exupéry</Surname>
        <Gender>Male</Gender>
        <OrderNum>15</OrderNum>
        <BirthDate>29.06.1900</BirthDate>
    </Person>
</Main>

Вот код, который я хочу использовать, чтобы получить список всех значений Имя элемента:

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load("PersonWrite.xml");
        XmlNodeList data = xmlDoc.SelectNodes("Main/Person/Name");

Проблема в том, что я получаю значение только от первого Person элемента.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Мне нравится использовать десериализацию, с ней намного проще работать.

using System;
using System.Xml.Serialization;
using System.IO;

public class Main
{
    [XmlElement("Person")]
    public Person[] People { get; set; }
}

public class Person
{
    public string Name { get; set; }

    public string Surname { get; set; }

    public string Gender { get; set; }

    public int OrderNum { get; set; }

    public string BirthDate { get; set; }
}

public class Program
{
    public static void Main()
    {
        var xmlString = @"<Main>
                        <Person>
                            <Name>Božena</Name>
                            <Surname>Němcová</Surname>
                            <Gender>Female</Gender>
                            <OrderNum>18</OrderNum>
                            <BirthDate>04.02.1820</BirthDate>
                        </Person>
                        <Person>
                            <Name>Jan</Name>
                            <Surname>Žižka</Surname>
                            <Gender>Male</Gender>
                            <OrderNum>7</OrderNum>
                            <BirthDate>19.09.1360</BirthDate>
                        </Person>
                        <Person>
                            <Name>Che</Name>
                            <Surname>Guevara</Surname>
                            <Gender>Male</Gender>
                            <OrderNum>27</OrderNum>
                            <BirthDate>14.06.1928</BirthDate>
                        </Person>
                        <Person>
                            <Name>Antonie</Name>
                            <Surname>de Saint-Exupéry</Surname>
                            <Gender>Male</Gender>
                            <OrderNum>15</OrderNum>
                            <BirthDate>29.06.1900</BirthDate>
                        </Person>
                    </Main>";

        var serializer = new XmlSerializer(typeof (Main));
        Main main = null;

        using (var reader = new StringReader(xmlString))
        {
            main = (Main)serializer.Deserialize(reader);
        }

        if (main == null)
        {
            return; 
        }

        Console.WriteLine(main.People.Length);
    }
}

Вывод:

4
0 голосов
/ 20 ноября 2018

Я бы прошел через дочерние узлы главного узла

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("PersonWrite.xml");
    XmlNodeList root = xmlDoc.SelectNodes("Main");
    foreach (XmlNode xnode in root.ChildNodes)
    {
       //get data from xnode
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...