【问题标题】:Ignoring case in SelectSingleNode Xpath not working.忽略 SelectSingleNode Xpath 中的大小写不起作用。
【发布时间】:2017-01-09 06:20:56
【问题描述】:

我正在尝试以下示例通过忽略大小写来选择一个节点,并且选择单个节点返回 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;

谁能帮忙。

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以以更易读的方式使用 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 支持名称可能区分大小写的不同节点(例如“节点”和“节点”),并且以“忽略大小写”方式“搜索”元素可能会在未来导致问题。

      【讨论】:

      • 感谢 Fabio,感谢您的 cmets。现有的旧代码有这个问题,必须通过选择单个节点来修复,以减少更改。因此使用 har07
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多