Получить все узлы, где атрибуты содержат данную строку - PullRequest
0 голосов
/ 10 января 2011

Я хочу получить все узлы 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 :: attributetename, это на самом деле работает.Где ошибка?

Я использую функцию содержимого, потому что может быть два разных случая, скажем, я хочу заменить $ HOST1 на $ HOST2:

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

Я не могупросто установите атрибут Value XmlNode, но мне нужно изменить строку.На самом деле я не знаю, сможет ли XPath справиться с этим путем поиска и замены или чего-то подобного.

Ответы [ 2 ]

0 голосов
/ 10 января 2011

Стандартная функция XPath contains() требует одной строки в качестве первого аргумента.Когда первый аргумент является списком узлов (как в вашем случае), используется только строковое значение первого узла в предоставленном наборе узлов.Вот как вы получаете текущие результаты.

Решение :

/FIREWALL/ETH/RULE/@*[contains(.,' + toTest + ')]
0 голосов
/ 10 января 2011

Используемый вами запрос проверяет объединенный текст всех атрибутов. Правильный синтаксис:

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

Другими словами, найдите соответствующий атрибут и верните его родительский элемент. Конечно, если вы хотите работать со значениями атрибутов, вы можете обойтись без /.. в конце, и в этом случае вам будут возвращены фактические узлы атрибута, и вы можете просто перебирать их, изменяя значения соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...