不区分大小写的 XPath 查询





5.00/5 (2投票s)
如何对所有小写元素执行 XPath 查询
引言
使用 XPath 查询可以快速在 XML 文件中查找值。前几天,我们在编写查询时发现需要查找 XML 中的元素,而无需考虑大小写。是的,我知道,你说得对,但编程有时会很脏。
Using the Code
以下扩展方法使我们能够执行不区分大小写的 XPath 查询。
public static class XDocumentExtensions
{
/// Transform the elements in the XDocument to all lower case
/// Only the elements are affected, not the attributes
public static XDocument TransformToLowerCaseElements(this XDocument value)
{
value.DescendantNodes().OfType<XElement>().ToList()
.ForEach(n => n.Name = n.Name.ToString().ToLower());
return value;
}
/// Transforms the XDocument to elements with lower case and returns the query result
public static XElement XPathSelectElementIgnoreCase(this XDocument value, string xpath)
{
return value.TransformToLowerCaseElements().XPathSelectElement(xpath);
}
/// Transforms the XDocument to elements with lower case and returns the query result
public static IEnumerable<XElement> XPathSelectElementsIgnoreCase
(this XDocument value, string xpath)
{
return value.TransformToLowerCaseElements().XPathSelectElements(xpath);
}
}
示例用法
以下 XML 作为示例
var xmlstring=@"<?xml version=""1.0"" encoding=""utf-8""?>
<Parents>
<Parent Name=""Chris"" Type=""father"">
<Child>
<Name>Jonathan</Name>
<AGE>13</AGE>
</Child>
</Parent>
</Parents>";
如果我们将此加载到 XDocument
中,然后将其转换为小写
var xdoc = XDocument.Parse(xmlstring);
xdoc.TransformToLowerCaseElements();
XML 将如下所示
<?xml version="1.0" encoding="utf-8"?>
<parents>
<parent Name="Chris" Type="father">
<child>
<name>Jonathan</name>
<age>13</age>
</child>
</parent>
</parents>
现在,知道此 XML 中的所有元素都可以转换为小写,我们就可以使用新的扩展方法对其进行查询
var xdoc = XDocument.Parse(xmlstring);
var age = xdoc.XPathSelectElementIgnoreCase("parents/parent/child/age").Value;
关注点
最初,我也将 xpath
参数在 XPathSelectElementIgnoreCase
中转换为小写。我删除了它,因为它使我无法在构建的查询中使用属性。
这些扩展方法在编写代码和测试时帮助我们很多,尤其是在 xsd 尚未最终确定时。
要了解有关 XPath 查询中不区分大小写的更多信息,请查看