2015-05-29 90 views
2

我想通过Xpath不区分大小写来搜索节点。通过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。该查询具有前缀,变量或用户定义的函数。我哪里做错了?

+0

当您使用的XPath :)。但严重的是,这里有没有理由不使用XDocument? – Jonesopolis

+0

你的答案就在这里 获取使用XPath属性 http://stackoverflow.com/questions/4531995/getting-attribute-using-xpath – bilal

+0

@bilal是的,但我也需要区分大小写.. – Matt3o

回答

4

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

使用translate

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

虽然这个链接可能回答问题,最好在这里包含答案的重要部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 – Joel

+0

明白了。谢谢。 –

2

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

.NET不支持的XPath 2.0。

所以,你可以使用这个可憎

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

(我硬编码的价值为便于与XPathBuilder测试。)

+0

谢谢!!有用!! – Matt3o

相关问题