我需要修复几个大型的错误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一起使用(如果有的话...)
答案 0 :(得分:2)
负向超前就足够了。
<tag>(?!<tag>)(?<Content>.+?)<\/tag>
仅采用最后一个<tag>
,即通过了超前检查的那个。
答案 1 :(得分:0)
您的“规范”由输入和所需输出的单个示例组成,这不一定是编写代码的良好基础,但是对于给定的示例,您可以采用替换{{1}的任何序列的方法}个带有单个<tag>
起始标签的起始标签,以及任何<tag>
个带有单个</tag>
结束标签的结束标签序列。
因此,将</tag>
替换为(<tag>)+
,并将<tag>
替换为(</tag>)+
。
如果我误解了这个问题,那么您需要找到一种更清晰地描述问题的方法。
当然,修复不良的XML不能替代修复最初生成不良XML的错误代码。