Ответ 1
Union
Чтобы получить оба узла, вам нужно использовать оператор union - |
Например, следующий запрос возвращает оба типа узлов - comp_div
и sty_ret_type
:
/meadinkent/record/comp_div | /meadinkent/record/sty_ret_type
Отфильтровать по значениям узлов:
Чтобы отфильтровать node на основе значений его узлов, вам нужно поместить все условия в те же скобки [nodeA='value1' and nodeB='value2']
Например, следующий запрос будет возвращать узлы записи, подэб-узлы которых соответствуют фильтру:
/meadinkent/record[comp_div='MENSWEAR' and sty_ret_type='ACCESSORIES']
Пример объединения С#:
[Test]
public void UnionExample()
{
string xml =
@"<meadinkent>
<record>
<comp_div>MENSWEAR</comp_div>
<sty_ret_type>ACCESSORIES</sty_ret_type>
<sty_pdt_type>BELTS</sty_pdt_type>
<pdt_category>AWESOME_BELTS</pdt_category>
</record>
</meadinkent>";
XDocument xDocument = XDocument.Parse(xml);
IEnumerable<XElement> selectedElements =
xDocument.XPathSelectElements(
"/meadinkent/record/comp_div | /meadinkent/record/sty_ret_type");
Assert.That(selectedElements.Count(), Is.EqualTo(2));
}
Фильтр С# на примерах узлов:
[Test]
public void FilterExample()
{
string xml =
@"<meadinkent>
<record>
<comp_div>MENSWEAR</comp_div>
<sty_ret_type>ACCESSORIES</sty_ret_type>
<sty_pdt_type>BELTS</sty_pdt_type>
<pdt_category>AWESOME_BELTS</pdt_category>
</record>
</meadinkent>";
XDocument xDocument = XDocument.Parse(xml);
IEnumerable<XElement> selectedElements =
xDocument.XPathSelectElements(
"/meadinkent/record[comp_div='MENSWEAR' and sty_ret_type='ACCESSORIES']");
Assert.That(selectedElements.Count(), Is.EqualTo(1));
Assert.That(selectedElements.First().Name.LocalName, Is.EqualTo("record"));
}