Regex для замены содержимого атрибута узла - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть XML-документ, подобный следующему:

<nodes> <node idName="employee">Some Text Here "employee" idName="employee" employee<innderNode idName="manager">Some Manager Text Here manager manager "manager" </innerNode> </node> </nodes>

Как заменить «сотрудник» на «руководитель» и заменить «менеджер» на «сотрудник» ТОЛЬКО ватрибуты?

Спасибо, г

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Я согласен, что в идеальном мире вы должны использовать правильный синтаксический анализатор XML.

Однако мир не идеален, и регулярные выражения могут справиться с этим, если вам это нужно.Вот пример, который будет работать с Perl / Sed, его должно быть легко преобразовать в любой язык:

s/<node idName="employee">(.*?)<\/node>/<node idName="supervisor">$1<\/node>/g

Это можно легко изменить, чтобы включить другие атрибуты, это будет выглядеть примерно так:*

s/<node (.*?idName=)"employee"(.*?)>(.*?)<\/node>/<node $1"supervisor"$2>$3<\/node>/g

И так далее, следите за тем, чтобы оно стало голодным, если XML содержит большие куски.

0 голосов
/ 15 сентября 2011

Регулярное выражение не может обрабатывать класс языков, частью которых является XML. Однако есть, конечно, хакерский способ сделать это:

  • Вы можете просто найти idName="something", включая знак равенства и кавычки, и заменить его на idName="somethingelse"

Однако, это, конечно, only работает, когда точная строка, как показано выше, наверняка не будет отображаться ни в одном теле XML-элемента как текст. Если это так, то на самом деле нет способа найти правильный синтаксический анализатор XML.

Хотя современные регулярные выражения могут обрабатывать больше, чем обычные языки, они могут обрабатывать только так много. Для анализа XML вам понадобится грамматика без контекста.

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