嵌套XML标签的PowerShell Regex

时间:2019-02-10 20:30:47

标签: regex xml powershell

我需要修复几个大型的错误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>

正则表达式递归似乎可以满足我的需求。 但是,我找不到有人解释它如何与PowerShell一起使用(如果有的话...)

2 个答案:

答案 0 :(得分:2)

负向超前就足够了。

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

仅采用最后一个<tag>,即通过了超前检查的那个。

答案 1 :(得分:0)

您的“规范”由输入和所需输出的单个示例组成,这不一定是编写代码的良好基础,但是对于给定的示例,您可以采用替换{{1}的任何序列的方法}个带有单个<tag>起始标签的起始标签,以及任何<tag>个带有单个</tag>结束标签的结束标签序列。

因此,将</tag>替换为(<tag>)+,并将<tag>替换为(</tag>)+

如果我误解了这个问题,那么您需要找到一种更清晰地描述问题的方法。

当然,修复不良的XML不能替代修复最初生成不良XML的错误代码。

相关问题