使用 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的主要内容,如果未能解决你的问题,请参考以下文章

在xpath搜索中使用通配符

python 使用xpath获取HTML和过滤器

使用 XPath 进行 Python XML 过滤 [重复]

RF库XML测试通过xpath查找元素的说明

XML.04-dom4j和XPath

使用 XPath 按类值过滤 HTML