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

C# 忽略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

我正在尝试下面的示例,通过忽略案例来选择一个节点,并且selectsinglenode返回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;
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一起去