Использование Xpath и чтение значений из одного имени атрибута - PullRequest
0 голосов
/ 04 апреля 2019

Я анализирую документ XML с использованием Xpath. Узел шагов имеет Атрибуты в форме шага. Я пытаюсь получить ценность каждого шага. Например, 0.03, 0.025,0.05 .... Но с моим кодом я получаю только 1-е значение, то есть 0.03 в списке строк. Вот код, который я пробовал:

XML-файл

private void btn_steps_Click(object sender, EventArgs e)
{
    List<string> step = new List<string>();

    XmlDocument doctst = new XmlDocument();

    doctst.Load(@"C:\ehData\workData\mywork.xml");

    XmlNodeList nodelistst = doctst.Selectnodes("//steps");

    foreach (XmlNode node in nodelistst)
    {
        step.Add(node["step"].InnerText);
    }

    listBox2.DataSource = step;
}

Кроме того, я прилагаю изображение файла XML, которое пытаюсь проанализировать. Что я делаю не так в этом кодексе?

Вот несколько строк XML-файла

<devices orderNo="67354698">
    <device serno="P1002001190">
      <steps>
        <step descriptor="160000556" element="1" usage="B">0.03</step>
        <step descriptor="160000556" element="2" usage="B">0.025</step>
        <step descriptor="160000556" element="3" usage="B">0.05</step>

Ответы [ 2 ]

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

1) Используя XmlDocument.GetElementsByTagName() с именем тега xml

...

XmlNodeList nodelistst1 = doctst.GetElementsByTagName("step");

foreach (XmlNode node in nodelistst1)
{
    step.Add(node.InnerText);
}

2) При использовании XmlDocument.SelectNodes() с XPath

...

XmlNodeList nodelistst = doctst.SelectNodes(".//devices/device/steps/step/text()");

foreach (XmlNode node in nodelistst)
{
    step.Add(node.Value);
}

Итак, в конечном итоге ваш результат по обоим вышеприведенным вариантам будет

foreach (var item in step)
{
    Console.WriteLine(item);
}

Вывод: (для предоставленного текста XML из OP)

enter image description here

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

Я не уверен, хотите ли вы значение атрибута или внутренний текст.Поэтому я помещаю все сюда.

Получение атрибутов:

Для получения атрибута descriptor из первого элемента step - вы можете использовать ниже XPath:

/devices/device/steps/step[1]/@descriptor

Этот XPath вернет - descriptor="160000556"

Если вы хотите только значение, вы можете использовать:

string(/devices/device/steps/step[1]/@descriptor)

Это вернет только значение, т.е. 160000556

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

Получение внутреннего текста:

И для получения внутреннего текста второго элемента step выможно использовать ниже XPath:

/devices/device/steps/step[2]/text()

Теперь эти XPath можно проходить через цикл и изменять индекс в квадратных скобках, чтобы получить все атрибуты и элементы.

Надеюсь, это поможет.

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