Комплексная модель регулярных выражений Powershell (XML) - PullRequest
1 голос
/ 26 марта 2020

У меня есть строка в XML, которую я пытаюсь перезапустить к varable (ниже).

<XMLElement><![CDATA[TEXT - I - FIND - INTERESTING]]></XMLElement>

Моя проблема в том, что я не знаю о регулярных выражениях, и мне трудно чтобы понять, как преобразовать мои специальные символы в «строку», которая не интерпретируется как символ регулярного выражения.

Текст в квадратных скобках может быть любой длины и любого символа; это то, что я хотел бы сохранить в моей переменной, например, «ТЕКСТ - Я - НАЙТИ - ИНТЕРЕСНО».

Мне также интересно, действительно ли это лучший подход к этой проблеме.

Любой поддержка будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

Не используйте regex для XML!

Работа с XML в PowerShell имеет то преимущество, что мы можем использовать XPath для поиска и навигации по документу. В вашем случае я бы использовал селектор text() для разрешения внутреннего значения раздела CDATA:

$xml = [xml]@'
<root>
    <XMLElement><![CDATA[TEXT - I - FIND - INTERESTING]]></XMLElement>
</root>
'@

$interestingString = $xml.SelectSingleNode('//XMLElement/text()').Value

//XMLElement означает «найти и <XMLElement> в любом месте »

0 голосов
/ 26 марта 2020

Функция text () хороша. Вот другой способ. Даже если узел не находится сверху, это должно работать.

get-content -raw file.xml | select-xml '//XMLElement' | 
  % { $_.node.'#cdata-section' }

TEXT - I - FIND - INTERESTING

Обратите внимание, что теги будут игнорироваться в разделе cdata. Пример:

'<script>
  <![CDATA[<message>Welcome to TutorialsPoint</message>]]>
</script>' | select-xml '/script' | % { $_.node.'#cdata-section' }

<message>Welcome to TutorialsPoint</message>
...