检索属性包含给定字符串的所有节点

时间:2011-01-10 14:33:59

标签: c# xml xpath

我想检索具有一个或多个包含给定字符串的属性的所有RULE节点。一旦我找到它们,我需要用新的字符串替换字符串。 我测试了那些XPath查询,但它们不起作用:

string xpathquery = "/FIREWALL/ETH/RULE[contains(@*,'" + toTest + "')]"; //DOES NOT WORK
string xpathquery = "/FIREWALL/ETH/RULE[contains(attribute::*,'" + toTest +"')]"; //DOES NOT WORK

奇怪的是,如果我使用@attributename或attribute :: attributename它实际上是有效的。错误在哪里?

我正在使用contains函数,因为可能有两种不同的情况,假设我想用$ HOST2替换$ HOST1:

<RULE .... host="$HOST1"/> //NO PROBLEM
<RULE .... host="$HOST1:21"/> //I NEED TO REPLACE ONLY $HOST1, NOT THE ENTIRE STRING

我不能只设置XmlNode的Value属性,但我需要修改字符串。实际上我不知道XPath是否可以通过查找和替换来处理这个问题。

2 个答案:

答案 0 :(得分:0)

您正在使用的查询检查所有属性的连接文本。正确的语法是:

string xpathquery = "/FIREWALL/ETH/RULE/@*[contains(.,'" + toTest + "')]/..";

换句话说,找到匹配的属性并返回其父元素。当然,如果你想要做的是使用属性值,你可以在最后省略/..,在这种情况下,你将返回实际的属性节点,并可以只是迭代修改它们相应的值。

答案 1 :(得分:0)

标准XPath函数contains()需要一个字符串作为其第一个参数。当第一个参数是节点列表时(如您所示),仅使用提供的节点集中第一个节点的字符串值。这就是您获得当前结果的方式。

<强>解决方案

/FIREWALL/ETH/RULE/@*[contains(.,' + toTest + ')]
相关问题