忽略SelectSingleNode Xpath中的大小写不起作用。

时间:2017-01-09 06:20:56

标签: c# xml xpath

我正在尝试以下示例通过忽略大小写来选择节点,并且select单节点返回null。

    XmlDocument doc = new XmlDocument();
    doc.LoadXml("<root><CHILD1>c1</CHILD1><CHILD2>c2</CHILD2></root>");
    var node = doc.SelectSingleNode("root");
    string nodeXpath = string.Format("//*[translate(@key, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']","child1");
    node = node.SelectSingleNode(nodeXpath);
    string innertext = node.InnerText;

有人可以提供帮助。

3 个答案:

答案 0 :(得分:1)

XPath中的

@key表示对名为key的属性的引用。您的XML中没有此类属性。如果您打算按元素名称进行匹配,那么您应该使用name()local-name()代替:

...
string xpath = "//*[translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']";
string nodeXpath = string.Format(xpath,"child1");
...

答案 1 :(得分:1)

您可以以更低的出价更可读的方式使用LINQ to Xml

XDocument doc = XDocument.Parse("<root><CHILD1>c1</CHILD1><CHILD2>c2</CHILD2></root>");
var singleNode = 
    doc.Root
       .Elements()
       .FirstOrDefault(element => element.Name.ToString().ToLower().Equals("child1"));

但请注意,XML支持名称可区分大小写的不同节点(例如&#34;节点&#34;和&#34;节点&#34;)和&#34;搜索&#34; &#34;忽略大小写&#34;方式会导致将来出现问题。

答案 2 :(得分:0)

我今天正在努力解决这个问题,我使用了您的解决方案。我只是将其包装在一个函数中,并在需要匹配根目录下的元素名称时调用它。奇迹般有效。谢谢!

private string GetNodeXpathCaseInsensitive(string value)
{
    string xpath = String.Format("//*[translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']", value.ToLower());
    return xpath;
}