我想通过Xpath case insensitve搜索节点。
<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 :(得分:8)
.NET不支持XPath 2.0。
所以你可以使用这种可憎的行为:
/Validation/Presentation/Slide[translate(@Tag,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz')= 'test']
(为了便于使用XPathBuilder进行测试,我对您的值进行了硬编码。)
答案 1 :(得分:4)
使用translate
doc.DocumentElement.selectSingleNode("/Validation/Presentation/Slide[translate(@Tag, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'test']")
答案 2 :(得分: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));