我有一个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>
<medinkent>
Run Code Online (Sandbox Code Playgroud)
我想使用XPath来选择匹配所有四个元素的节点,并且我无法正确获取布尔语法.我正在尝试将前两个匹配作为测试:
"/meadinkent/record/comp_div[.='" & comp_div & "'] and /meadinkent/record/sty_ret_type[.='" & sty_ret_type & "']"
Run Code Online (Sandbox Code Playgroud)
哪个失败,说没有返回节点.显然我是非常愚蠢的 - 我做错了什么?
干杯,mAtt
Eli*_*sha 43
联盟
为了获得两个节点,您需要使用union运算符 -|
例如,下一个查询将返回两种类型的节点 - comp_div
和sty_ret_type
:
/meadinkent/record/comp_div | /meadinkent/record/sty_ret_type
Run Code Online (Sandbox Code Playgroud)
按子节点值
过滤为了根据节点的子节点值过滤节点,您需要将所有条件放在相同的括号中[nodeA='value1' and nodeB='value2']
例如,下一个查询将返回其子节点与过滤器匹配的记录节点:
/meadinkent/record[comp_div='MENSWEAR' and sty_ret_type='ACCESSORIES']
Run Code Online (Sandbox Code Playgroud)
AC#union示例:
[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));
}
Run Code Online (Sandbox Code Playgroud)
AC#过滤子节点示例:
[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"));
}
Run Code Online (Sandbox Code Playgroud)
你只需要具备and
的条件ED列表内的[ ]
选择为record
:
/meadinkent/record[compdiv[.='MENSWEAR'] and sty_ret_type[.='ACCESSORIES']]
Run Code Online (Sandbox Code Playgroud)
读作:在顶级meadinkent
节点下,record
节点,具有子compdiv
(具有值MENSWEAR
)和子sty_ret_rype
(具有值ACCESSORIES
).