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

Mat*_*t3o 3 c# xml xpath

我想通过Xpath case insensitve搜索节点.

<Validation>
    <Presentation>
        <Slide Tag= "Test">
            <FontSize Value = "36"/>
        </Slide>
    </Presentation>
</Validation>
Run Code Online (Sandbox Code Playgroud)

我用过这段代码

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

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

Ste*_*ens 9

.NET不支持XPath 2.0.

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

    /Validation/Presentation/Slide[translate(@Tag,
   'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
   'abcdefghijklmnopqrstuvwxyz')= 'test']
Run Code Online (Sandbox Code Playgroud)

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


Liu*_*Liu 6

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

translate

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


And*_*yev 5

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));
Run Code Online (Sandbox Code Playgroud)