通过XPath选择属性不区分大小写的节点
我想通过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。该查询具有前缀,变量或用户定义的函数。我哪里做错了?
你试过吗?
INFO:使用XPath与MSXML执行不区分大小写的搜索: https://support.microsoft.com/en-us/kb/315719
使用translate
doc.DocumentElement.selectSingleNode("/Validation/Presentation/Slide[translate(@Tag, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'test']")
虽然这个链接可能回答问题,最好在这里包含答案的重要部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 – Joel
明白了。谢谢。 –
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));
.NET不支持的XPath 2.0。
所以,你可以使用这个可憎
/Validation/Presentation/Slide[translate(@Tag,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz')= 'test']
(我硬编码的价值为便于与XPathBuilder测试。)
谢谢!!有用!! – Matt3o
当您使用的XPath :)。但严重的是,这里有没有理由不使用XDocument? – Jonesopolis
你的答案就在这里 获取使用XPath属性 http://stackoverflow.com/questions/4531995/getting-attribute-using-xpath – bilal
@bilal是的,但我也需要区分大小写.. – Matt3o