繁体   English   中英

使用sed连接XML的子元素

[英]concatenating sub-elements of XML using sed

我有一个很大的xml文件,需要将其加载到具有预定义格式的列表中。 它具有许多子元素,如下所示:

<tag1>
  <tag2>element 1</tag2>       
  <tag2>element 2</tag2>
  <tag2>element 3</tag2>
  ...
</tag1>

我想将这些子元素组合成一个字符串,如下所示:

<tag1>
  <tag2>element 1;element 2;element 3;...</tag2>
</tag1>

标记的实际路径更为复杂。

由于子元素的数量通常很大,因此我想对文件进行预处理以简化列表转换过程。 我尝试使用XQuery,但速度非常慢(可能是因为我不知道如何优化它)。 我认为使用XLST还是很有效的,但是我没有时间去弄清楚该怎么做。

这是我解决问题的方法:

cat file | tr '\n' '±' | sed 's/<\/tag2>±<tag2>/;/g' | tr '±' '\n'

我用tr替换了所有LF,用一个我知道不会出现在文件中的字符(±)进行替换,然后搜索end标记,然后跟随±,再跟随start标记,并用“;”替换。 然后,我再次使用tr来还原LF。

通过将sed输出传递到另一个sed替代中,您可以“平展”任意数量的标签,这正是我需要的,因为我需要平整多个标签。 这使我文件中的行减少了95%,从而使其余的解析非常简单。

是的,可能XSLT可以工作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template name="extract-item" match="/">
  <xsl:element name="tag1">
    <xsl:element name="tag2">
      <xsl:for-each select="//tag1">        
            <xsl:apply-templates select="tag2"/>        
      </xsl:for-each>
     </xsl:element>  
  </xsl:element>  
</xsl:template>


</xsl:stylesheet>

和python脚本一起使用lxml库进行转换:

#!/usr/bin/python
import lxml.etree as ET

dom = ET.parse('C:\Path\To\XMLFile.xml')
xslt = ET.parse('C:\Path\To\XSLTFile.xsl')
transform = ET.XSLT(xslt)
newdom = transform(dom)

tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True)
print(tree_out)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM