#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