如何在Xpath表达式中获取节点的子字符串

时间:2012-04-12 22:03:48

标签: c# .net xpath

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

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

(你可以看到我绝望了。)

它们都会出错(“表达式必须评估到节点集”)

//容器/ __ name / text()顺便说一下(它的长度为6个字符)。

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

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

nodeList = xdoc.SelectNodes(xpathBox.Text);

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

2 个答案:

答案 0 :(得分: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);
  }

答案 1 :(得分:0)

问题在于您尝试执行此操作。返回值是一个节点集,并且您正在尝试返回一个字符串。

您需要先返回节点,然后只需对其执行字符串函数。

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

var new = old.Substring(1,2)