我正在尝试以下示例通过忽略大小写来选择节点,并且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;
有人可以提供帮助。
答案 0 :(得分:1)
@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;
}