通过XPath选择属性不区分大小写的节点

本文关键字:大小写 节点 不区 XPath 选择 属性 通过 | 更新日期: 2023-09-27 17:51:04

我想通过不区分大小写的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 Exceptions: Namespace Manager或XsltContext。该查询具有前缀、变量或用户定义函数。我哪里做错了?

通过XPath选择属性不区分大小写的节点

。. NET不支持XPath 2.0。

所以你可以使用这个讨厌的:

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

(为了便于XPathBuilder测试,我硬编码了您的值)

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

使用translate

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

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));