我想检索具有一个或多个包含给定字符串的属性的所有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是否可以通过查找和替换来处理这个问题。
答案 0 :(得分:0)
您正在使用的查询检查所有属性的连接文本。正确的语法是:
string xpathquery = "/FIREWALL/ETH/RULE/@*[contains(.,'" + toTest + "')]/..";
换句话说,找到匹配的属性并返回其父元素。当然,如果你想要做的是使用属性值,你可以在最后省略/..
,在这种情况下,你将返回实际的属性节点,并可以只是迭代修改它们相应的值。
答案 1 :(得分:0)
标准XPath函数contains()
需要一个字符串作为其第一个参数。当第一个参数是节点列表时(如您所示),仅使用提供的节点集中第一个节点的字符串值。这就是您获得当前结果的方式。
<强>解决方案强>:
/FIREWALL/ETH/RULE/@*[contains(.,' + toTest + ')]