【问题标题】:Replace end tag with value from opening tag用开始标签中的值替换结束标签
【发布时间】:2016-01-11 03:06:24
【问题描述】:

由于某种原因,我用于某些目的的许多 XML 文件现在具有以下结构:

<A1333>006</ANDfoo>
<A45>RO0</ANDfoo>
<A5652>5486465465</ANDfoo>
<A173>TEST DUMMY</ANDfoo>
<A1805>34566000</ANDfoo>
<A3>FKK</ANDfoo>
<A2>FKK</ANDfoo>
<A2002></ANDfoo>
<A9903>CV0000</ANDfoo>
<A558>
               <B1>GHJ</B1>
               <B5>101010</B5>
</ANDfoo>

所有结束标记现在都具有相同的值。如何将结束标记中的值替换为开始标记中的正确值,以便再次获得有效的 XML。我尝试使用 sed 但到目前为止没有成功的结果。您能否举一个使用 sed 进行此类替换的示例?

谢谢!

【问题讨论】:

  • 当这些 XML 文件根本不是这样的时候,你为什么要调用它们?
  • 它们曾经是 XML 文件,现在需要一些更正才能再次成为有效的 XML。

标签: xml replace sed


【解决方案1】:
sed -e 's/<\([^>]*\)>\([^<>]*\)<[^>]*>/<\1>\2<\/\1>/g;  \ # fix Tags ending on same line
        /^<[^\/>]*>$/h;                                 \ # Push single opening tag
        /^<\/[^>]*>$/{g;s/</<\//}'                        # Pop and fix single closing tag

这将修复标签开始和结束在同一行,以及包含一个嵌套级别并且开始和结束在不同行的标签。

要从 XML-oneliner 中实现这一点,您可以再次使用 sed:

sed -e 's/\(<\/[^>]*>\)\s*/\1\n/g'     \ # Break after closing tag
    | sed -e 's/>\s*\(<\w*>\)/>\n\1/g'   # Break before opening tag if not on beginning of line

【讨论】:

  • 所有标签实际上都在一行中,我只是使用漂亮的打印来更清楚地看到它:006RO05486465465 ANDfoo>TEST DUMMY34566000FKKFKKCV0000 GHJ101010
  • @spiderpc:好的,合并了这个要求。不过,对于多级嵌套,您需要寻找 sed 以外的其他内容。
猜你喜欢
  • 2016-05-24
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多