C # итерация и сравнение нескольких узлов - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть файл XML, мне нужно перебрать файл XML и сравнить значение атрибута узлов.Условие - это то, что атрибут в элементе узла должен иметь определенный набор значений.

Позвольте мне сделать это более простым для понимания, показав пример ниже:

<Node name="SomeName">
<Element attribute="somevalue"/>
</Node>
<Node name="SomeNameMore">
 <Element attribute="somevalue"/>
</Node>
<Node name="SomeNameEtc.">
 <Element attribute="somevaluenotmatch"/>
</Node>
<Node name="SomeName">
 <Element attribute="somevalue"/>
</Node>

Есть 100 изаналогичные узлы в файле XML.

1-е условие: совпадение с атрибутом 'somevalue'

2-е условие: сравнение всех узлов в 1-м условии (результат) для имени атрибута в узле.

У меня естьсделано как показано ниже:

        XmlTextReader Reader = new XmlTextReader("C:\\TEST\test.xml");
        XmlDocument doc = new XmlDocument();
        doc.Load(Reader);

        XPathNavigator nav = doc.CreateNavigator();
        XmlElement rootNode = doc.DocumentElement;

        XPathExpression expr;

        expr = nav.Compile("//Element[@attribute='somevalue']");
        XPathNodeIterator iterator = nav.Select(expr);

        foreach (XmlElement item in iterator)
        {
          //how do go back to node here (whose element has attribute 'somevalue' and compare with the next node if the attribute 'name' of Node matches
          } ;

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вы можете использовать linq, чтобы выполнить то, что вы ищете, я не уверен, правильно ли я понял второй сценарий, но я поделюсь примером для первого, он может помочь вам найти хороший способ сделатьit:

var xml = XDocument.Load("your_xmlFile_path");
var query = from c in xml.Root.Descendants("Node").Descendants("Element")
            where c.Attribute("attribute").Value == "somevalue"
            select c;

Я проверил для вас запрос, он возвращает правильное количество элементов "somevalue".

EDIT Вы можете получить имя вместозначение атрибута путем замены

c.Attribute("attribute").Value

на

c.Attribute("attribute").Name

Надеюсь, это поможет, удачи

0 голосов
/ 20 декабря 2018

Используйте xml linq, который легко создаст словарь необходимых значений

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

namespace ConsoleApplication93
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XDocument doc = XDocument.Load(FILENAME);
            Dictionary<string, string> dict = doc.Descendants("Node")
                .GroupBy(x => (string)x.Attribute("name"), y => (string)y.Element("Element").Attribute("attribute"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

            //or if you have multiple items with same key
            Dictionary<string, List<string>> dict2 = doc.Descendants("Node")
                .GroupBy(x => (string)x.Attribute("name"), y => (string)y.Element("Element").Attribute("attribute"))
                .ToDictionary(x => x.Key, y => y.ToList());

        }

    }


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