【问题标题】:How to get a substring of a node in an Xpath expression如何在 Xpath 表达式中获取节点的子字符串
【发布时间】:2012-04-12 22:03:47
【问题描述】:

我将 xpath 表达式传递给 XmlDocument 并调用 SelectNodes(expression) - 我试图只返回子字符串。到目前为止我已经尝试过

substring(//Container/__name,2)
substring(//Container/__name/text(),2)
//Container/__name/substring(.,2)
//Container/__name/text()/substring(.,2)

(你可以看到我越来越绝望)。

它们都给出错误(“表达式必须评估为节点集”)

顺便说一下,

//Container/__name/text() 有效(它有 6 个字符长)。

这样做的正确方法是什么?

编辑: 这是确切的代码(没什么太壮观的)

nodeList = xdoc.SelectNodes(xpathBox.Text);

我真的想提出一个纯 xpath 解决方案 - 这是一个实用程序,它允许通过提供 xpath 表达式和字符串来修改 xml 文档 - 字符串是所选节点中文本的替换通过 xpath 表达式。我希望能够进行部分替换。因此,如果这是不可能的,是否有任何关于如何最优雅地实现我的目标的建议:用字符串替换部分文本节点,仅使用 xpath 表达式和字符串。或许还有其他功能?

【问题讨论】:

    标签: c# .net xpath


    【解决方案1】:

    如果 XPath 的评估结果不是节点集,请使用 Evaluate 而不是 SelectNodes

      string substr = xdoc.CreateNavigator().Evaluate("substring(//Container/__name,2)") as string;
    

    要修改所有 __name 元素中的文本,您可以执行以下操作:

      foreach (XmlNode node in xdoc.SelectNodes("//Container/__name")) {
        XmlElement nameElement = node as XmlElement;
        nameElement.InnerText = nameElement.InnerText.Substring(2);
      }
    

    【讨论】:

    • 我一直在慢慢弄清楚如何使用 Evaluate(),但似乎 a) 并没有完全完成我想要做的事情,并且 b) 也许不可能做到我正在尝试做的事情。
    • 我明白了 - 如果您对 Evaluate() 有特定问题,请发布它,我会经常使用它...如果无法完成您想做的事情,好吧,抱歉!
    • 感谢 MiMo,这是一个观察结果(可能带有隐含的问题),而不是抱怨。
    【解决方案2】:

    问题在于您尝试执行此操作的位置。预期返回值是一个节点集,而您正试图返回一个字符串。

    你需要先返回节点,然后对它执行一个字符串函数。

    一旦您将text() 节点返回到您的代码,您可以在其中检查它的长度是否为 6 个字符,您可以在其上运行子字符串吗?

    var new = old.Substring(1,2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多