PowerShell Regex для вложенных тегов XML - PullRequest
0 голосов
/ 10 февраля 2019

Мне нужно исправить несколько огромных глючных XML-файлов.Поскольку они глючат, я не могу просто сделать:

[xml]$xml = Get-Content .\data.xml

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

Вот простой пример, иллюстрирующий мою проблему.

$xml = '<tag><tag><tag>Anything</tag><tag>Something else</tag></tag><tag><tag>Another value</tag><tag>And another one...</tag></tag></tag>'
$Pattern = '<tag>(?<Content>.+?)</tag>'
([regex]::Matches($Xml, $Pattern)).Value

Этот фрагмент кода возвращает:

<tag><tag><tag>Anything</tag>
<tag>Something else</tag>
<tag><tag>Another value</tag>
<tag>And another one...</tag>

Как я могу изменить свой шаблон Regex, чтобы получить это?

<tag>Anything</tag>
<tag>Something else</tag>
<tag>Another value</tag>
<tag>And another one...</tag>

Кажется, что рекурсия Regex будет соответствовать моим потребностям.Однако я не смог найти кого-то, объясняющего, как это работает с PowerShell (если вообще ...)

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Ваша «спецификация» состоит из одного примера ввода и желаемого вывода, что не обязательно является хорошей основой для написания кода, но для данного примера вы могли бы принять подход замены любой последовательности <tag> startтеги с одним <tag> начальным тегом и любой последовательностью </tag> конечных тегов с одним </tag> конечным тегом.

Поэтому замените (<tag>)+ на <tag>, а (</tag>)+ на </tag>.

Если я неправильно понял вопрос, то вам нужно найти способ более четко описать проблему.

Конечно, исправление плохого XML не заменит исправление ошибочного кода.который сгенерировал плохой XML в первую очередь.

0 голосов
/ 10 февраля 2019

Отрицательного взгляда достаточно.

<tag>(?!<tag>)(?<Content>.+?)<\/tag>

Требуется только последний <tag>, который проходит проверку на ожидание.

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