C# 忽略SelectSingleNode Xpath中的大小写不起作用。
我正在尝试下面的示例,通过忽略案例来选择一个节点,并且selectsinglenode返回nullC# 忽略SelectSingleNode Xpath中的大小写不起作用。,c#,xml,xpath,C#,Xml,Xpath,我正在尝试下面的示例,通过忽略案例来选择一个节点,并且selectsinglenode返回null XmlDocument doc = new XmlDocument(); doc.LoadXml("<root><CHILD1>c1</CHILD1><CHILD2>c2</CHILD2></root>"); var node = doc.SelectSingleNode("root"); st
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;
XmlDocument doc=新的XmlDocument();
doc.LoadXml(“c1c2”);
var node=doc.SelectSingleNode(“根”);
string nodeXpath=string.Format(“/*[translate(@key,'abcdefghijklmnopqrstuvxyz','abcdefghijklmnopqrstuvxyz')='{0}'],“child1”);
node=node。选择singlenode(nodeph);
字符串innertext=node.innertext;
有人能帮忙吗。
@key
在XPath中表示对名为key
的属性的引用。XML中没有这样的属性。如果要按元素名称匹配,则应使用name()
或local-name()
:
...
string xpath = "//*[translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']";
string nodeXpath = string.Format(xpath,"child1");
...
XPath中的
@key
表示对名为key
的属性的引用。XML中没有这样的属性。如果要按元素名称匹配,则应使用name()
或local-name()
:
...
string xpath = "//*[translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']";
string nodeXpath = string.Format(xpath,"child1");
...
您可以以更易读的方式使用LINQ到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"));
XDocument doc=XDocument.Parse(“c1c2”);
var singleNode=
根文件
.要素()
.FirstOrDefault(element=>element.Name.ToString().ToLower().Equals(“child1”));
但是请注意,XML支持不同的节点,其中名称可以区分大小写(例如“Node”和“Node”),以“忽略大小写”的方式“搜索”元素可能会在将来导致问题。您可以以更易读的方式使用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"));
XDocument doc=XDocument.Parse(“c1c2”);
var singleNode=
根文件
.要素()
.FirstOrDefault(element=>element.Name.ToString().ToLower().Equals(“child1”));
但是请注意,XML支持不同的节点,其中名称可以区分大小写(例如“Node”和“Node”),以“忽略大小写”的方式“搜索”元素可能会导致将来出现问题。我今天正在处理这个问题,我使用了您的解决方案。我只是将它包装在一个函数中,并在需要匹配根目录下的元素名时调用它。工作起来很有魅力。谢谢
private string GetNodeXpathCaseInsensitive(string value)
{
string xpath = String.Format("//*[translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']", value.ToLower());
return xpath;
}
我今天正在处理这个问题,我使用了你的解决方案。我只是将它包装在一个函数中,并在需要匹配根目录下的元素名时调用它。工作起来很有魅力。谢谢
private string GetNodeXpathCaseInsensitive(string value)
{
string xpath = String.Format("//*[translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']", value.ToLower());
return xpath;
}
谢谢法比奥,谢谢你的评论。现有的旧代码存在此问题,必须使用select single node进行修复,以使更改最少。因此,我要感谢法比奥,谢谢你的评论。现有的旧代码存在此问题,必须使用select single node进行修复,以使更改最少。因此与har07一起去