使用 xPath 和通配符过滤 XMLNodeList
Posted
技术标签:
【中文标题】使用 xPath 和通配符过滤 XMLNodeList【英文标题】:Filter XMLNodeList using xPath & Wildcard characters 【发布时间】:2016-02-02 11:40:43 【问题描述】:我有如下的“XML”:
<ParentNode>
<ChildNode id="1" Display_Name="ABC"/>
<ChildNode id="2" Display_Name="DEF"/>
<ChildNode id="3" Display_Name="DAX"/>
<ChildNode id="4" Display_Name="LAM"/>
<ChildNode id="5" Display_Name="PKR"/>
<ChildNode id="6" Display_Name="UYA"/>
</ParentNode>
我想获取 C# 中 XMLNodeList 中所有节点的列表,使用在 Display_Name 中具有“A”[无论大小写]的 xPath强>属性。
我试过的是:
root.SelectNodes("descendant-or-self::*[contains(@DISPLAY_NAME,'end')]")
这里,root 包含我的 XML,它是 XMLDocument 的对象。
另外,如何通过忽略 Display_Name 是 小写字母 或 大写字母 来制作此过滤器。
【问题讨论】:
【参考方案1】:“我想在
Display_Name
属性中使用具有"A"
[无论大小写] 的xPath 获取C# 中XMLNodeList
中所有节点的列表。”
XML 和 XPath 的本质是区分大小写的。使用 XPath(至少在 XPath 1.0 中,.NET 支持的版本)没有很好的方法来进行不区分大小写的匹配。一种已知的方法是使用translate()
将Display_Name
值转换为小写,然后再进行进一步比较,如下所示(参见related post):
var xpath = @"//*[
contains(
translate(@Display_Name
,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
,'abcdefghijklmnopqrstuvwxyz'
)
,'a'
)
]";
var result = root.SelectNodes(xpath);
【讨论】:
嗨@har07, -> ,'a' .. 的意义是什么。只是好奇 @ShubhamJain 来自引用部分:"...使用 xPath,在 Display_Name 属性中具有 "A" [无论大小写]" 【参考方案2】:用下面的 XPath 试试
/ParentNode/ChildNode/@Display_Name
同时获得结果
Above XPath 将返回 ChildNode 的所有结果。现在迭代这个 XPath 以提取所有结果
希望对你有帮助:)
【讨论】:
但是如何让它在所有子节点中通过野搜索过滤? 正如你所建议的,我已经尝试过 docGetInternal.SelectNodes("/DISPLAY_TABLE_FIELDS_LOOKUP_TABLE/DISPLAY_TABLE_FIELDS_LOOKUP_ROW[contains(.,'end')]");但它也不适用于我的情况。【参考方案3】:使用 OuterXml 方法。
试试这个:
//Load Data
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
//Go the xPath
XmlNode titleNode = xmlDoc.SelectSingleNode(xPath);
//Get the OutXml (You dont need to use a new variable)
string nodeValue = titleNode.OuterXml;
//Load this string as a new XmlDocument and use the second xPath
XmlDocument xmlDoc2 = new XmlDocument();
xmlDoc2.LoadXml(nodeValue);
titleNode = xmlDoc.SelectSingleNode(xPath2);
【讨论】:
以上是关于使用 xPath 和通配符过滤 XMLNodeList的主要内容,如果未能解决你的问题,请参考以下文章