2012-04-12 41 views
0

我传递一个XPath表达式到的XmlDocument和调用的SelectNodes(表达) - 我想只返回字符串。到目前为止,我试过如何获取一个节点的子XPath表达式

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

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

他们的所有错误(“表达式必须计算节点集合”)

//容器/ __名/文()的作品,顺便(和它的6个字符)。

什么是正确的方法来做到这一点?

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

nodeList = xdoc.SelectNodes(xpathBox.Text); 

我真的想拿出一个纯粹的XPath的解决方案 - 这是一个工具,它允许一个XML文档被修改提供一个xpath表达式和一个字符串 - 该字符串替代了由xpath表达式选择的节点中的文本。我希望能够做部分替换。所以,如果有什么这是不可能的,是有关于如何最优雅的完成我的目标有何建议:用一个字符串替换文本节点的一部分,只使用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); 
    } 
+0

我一直在慢慢地搞清楚如何使用Evaluate(),但它看起来像一个)临屋区t并没有完全实现我想要做的事情,b)也许这是不可能做到我想要做的。 – Aerik 2012-04-19 04:55:27

+0

我看到 - 如果你有一个评估特定问题()后,我用它了很多...如果它是不可能做你正在尝试做的,好了,对不起! – MiMo 2012-04-19 07:38:05

+0

感谢MiMo,这是一个观察(也许暗含的问题),而不是投诉。 – Aerik 2012-04-19 18:53:25

0

的问题是,在那里你想执行这个。返回值是作为一个节点集预期的,并且您试图返回一个字符串。

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

一旦你的text()节点返回到您的代码,在这里你可以查看它的6个字符,你可以运行在该子?

var new = old.Substring(1,2)