【问题标题】:Select node with attribute case insensitive via XPath通过 XPath 选择属性不区分大小写的节点
【发布时间】:2015-05-29 22:36:59
【问题描述】:

我想通过 Xpath 不区分大小写来搜索节点。

<Validation>
    <Presentation>
        <Slide Tag= "Test">
            <FontSize Value = "36"/>
        </Slide>
    </Presentation>
</Validation>

我用过这段代码

String xPath = string.Format("/Validation/Presentation/Slide[lower-case(@Tag)='{0}'][1]", "test");
XmlNode node = doc.DocumentElement.SelectSingleNode(xPath);

但它会引发 XPath 异常:需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。我哪里做错了?

【问题讨论】:

  • 当您使用 XPath 时 :)。但说真的,这里有理由不使用 XDocument 吗?
  • 您的答案在这里 使用 XPath 获取属性 stackoverflow.com/questions/4531995/…
  • @bilal 是的,但我还需要不区分大小写..

标签: c# xml xpath


【解决方案1】:

.NET 不支持 XPath 2.0。

所以你可以使用这个可憎的:

    /Validation/Presentation/Slide[translate(@Tag,
   'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
   'abcdefghijklmnopqrstuvwxyz')= 'test']

(为了便于使用 XPathBuilder 进行测试,我将您的值硬编码。)

【讨论】:

    【解决方案2】:

    你试过吗?
    信息:使用 XPath 通过 MSXML 执行不区分大小写的搜索: https://support.microsoft.com/en-us/kb/315719

    使用translate

    doc.DocumentElement.selectSingleNode("/Validation/Presentation/Slide[translate(@Tag, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'test']")
    

    【讨论】:

      【解决方案3】:

      lower-case 是 XPath 2.0 函数,.NET 本身只支持 Xpath 1.0 表达式,所以不能这样使用。

      您也可以使用 Linq2Xml:

      var doc = XDocument.Load(@"your_file_Name");
      var node = doc.XPathSelectElements("/Validation/Presentation/Slide")
                     .FirstOrDefault(x => x.Attribute("Tag") != null 
                                          && String.Equals(x.Attribute("Tag").Value, "test",
                                                       StringComparison.CurrentCultureIgnoreCase));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-28
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多