Есть ли способ найти элемент нескольких узлов XML -файла по XPath? - PullRequest
0 голосов
/ 03 марта 2020

Я хочу найти элемент нескольких узлов в XML -филе по XPath. Путь к узлам:

(/ глава / блок / процедура / шаг / действие / таблица / tgroup / tbody / строка / запись / p / поле формы)

Я хочу получить Элемент field_id из поля формы Childnode. В XML -файле есть несколько полей формы. Все они имеют одинаковый путь, но расположены в разных строках (/ ряд).

Я пробовал:

XmlDocument doc = new XmlDocument();
doc.Load("xmlfile.xml");
XmlNode node = doc.DocumentElement.SelectSingleNode("/chapter/block/procedure/step/action/table/tgroup/tbody/row/entry/p/formfield");
string attr = node.Attributes["field_id"]?.InnerText;
Console.WriteLine(attr);

Это дает мне только field_id из первого поля формы. Я пробовал несколько других способов получить каждый идентификатор, но я всегда получаю исключение System.NullReferenceException. Как я могу получить каждый field_id?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Вы можете использовать xml linq и поместить результаты в словарь

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

namespace ConsoleApplication159
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            Dictionary<string, XElement> dict1 = doc.Descendants("formfield")
                .GroupBy(x => (string)x.Attribute("field_id"), y => y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
            //where attibutes may be repeated
            Dictionary<string, List<XElement>> dict2 = doc.Descendants("formfield")
                .GroupBy(x => (string)x.Attribute("field_id"), y => y)
                .ToDictionary(x => x.Key, y => y.ToList());
        }
    }
}
1 голос
/ 03 марта 2020

Будет легко, если вы поделитесь примером XML. Однако вы можете попробовать приведенный ниже пример кода, используя XmlDocument

var xmldoc = new XmlDocument();
xmldoc.Load("xmlfile.xml");
var result = xmldoc.SelectNodes("chapter/block/procedure/step/action/table/tgroup/tbody/row/entry/p/formfield/@field_id");
foreach (XmlNode item in result)
{
    Console.WriteLine(item.Value);
}

. Существует другой подход, использующий XDocument и LINQ

var xdoc = XDocument.Load("xmlfile.xml");
var nodes = string.Join(", ", xdoc.Descendants("formfield")
                                  .Select(x => x.Attribute("field_id")));

, добавленный ниже код, основанный на комментарии

Ниже приведен код для чтения комментариев в XML с использованием XElement

var xdoc = XElement.Load("xmlfile.xml");
var comments = xdoc.DescendantNodes().OfType<XComment>();

foreach (XComment comment in comments)
{
  //read comments here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...