Xpath или оператор. Как использовать

#xpath #operators

#xpath #операторы

Вопрос:

Я не понял, как именно использовать оператор or в Xpath.

Давайте предположим, что у меня есть xml с этой структурой:

 <root>
    <a>
        <b/>
        <c/>
    </a>
    <a>
        <b/>
    </a>
    <a>
        <d/>
        <b/>
    </a>
    <a>
        <d/>
        <c/>
    </a>
</root>
 

могу ли я получить с помощью одного Xpath все узлы A, которые имеют как можно скорее узел B или C.
Я знаю, что мог бы искать B и see по-разному и после суммирования результата удалять повторения (как показано ниже), но я уверен, что есть лучший способ.

 List1 = Xpath(./a/b/..)
List2 = Xpath(./a/c/..)
MyResult = (List1   List2 - Repetitions)
 

Я предполагаю, что решение может быть применено и для оператора AND .

Ответ №1:

/root/a[b or c] даст вам все <a> элементы, которые имеют либо a <b> , либо <c> дочерние.

Ответ №2:

Попробуйте:

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

namespace XpathOp
{
    class Program
    {
        static void Main(string[] args)
        {
            const string xml = @"<?xml version='1.0' encoding='ISO-8859-1'?>
                <root>
                    <a>
                        <b/>
                        <c/>
                    </a>
                    <a>
                        <b/>
                    </a>
                    <a>
                        <d/>
                        <b/>
                    </a>
                    <a>
                        <d/>
                        <c/>
                    </a>
                </root>";

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            foreach (XmlNode node in doc.SelectNodes("//a[b or c]"))
            {
                Console.WriteLine("Founde node, name: {0}, hash: {1}", node.Name, node.GetHashCode());
            }

            XPathDocument xpathDoc = new XPathDocument(new MemoryStream(Encoding.UTF8.GetBytes(xml)));

            XPathNavigator navi = xpathDoc.CreateNavigator();
            XPathNodeIterator nodeIter = navi.Select("//a[b or c]");

            foreach (XPathNavigator node in nodeIter)
            {
                IXmlLineInfo lineInfo = node as IXmlLineInfo;
                Console.WriteLine("Found at line {0}, position {1}", lineInfo.LineNumber, lineInfo.LinePosition);
            }
        }
    }
}
 

Вывод:

 Found node, name: a, hash: 62476613
Found node, name: a, hash: 11404313
Found node, name: a, hash: 64923656
Found node, name: a, hash: 44624228
Found at line 3, position 26
Found at line 7, position 26
Found at line 10, position 26
Found at line 14, position 26