我将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表达式和字符串。也许是另一个功能?
答案 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)