使用sed连接XML的子元素

时间:2015-06-21 09:48:44

标签: xml parsing 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也非常有效,但我没有时间去研究如何做到这一点。

2 个答案:

答案 0 :(得分:1)

以下是我解决问题的方法:

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

我用tr用我知道的文件中没有出现的字符替换所有的LF(±),然后搜索结束标记,然后是±后跟开始标记,并用“;”替换它。然后我再次使用tr来恢复LF。

通过将sed输出连接到另一个sed替换,您可以“平坦化”任意数量的标签,这正是我需要的,因为我有几个标签需要展平。这使我的文件中的行减少了95%,使得其余的解析变得非常简单。

答案 1 :(得分:0)

是的,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>

使用lxml库进行转换的python脚本:

#!/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)