【问题标题】:Filter XMLNodeList using xPath & Wildcard characters使用 xPath 和通配符过滤 XMLNodeList
【发布时间】: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小写字母大写字母 来制作此过滤器。

【问题讨论】:

    标签: c# xml xpath xmlnode xmlnodelist


    【解决方案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);
    
    

    【讨论】:

      猜你喜欢
      • 2014-09-06
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 2015-08-28
      相关资源
      最近更新 更多