【问题标题】:concatenating sub-elements of XML using sed使用 sed 连接 XML 的子元素
【发布时间】:2015-09-06 21:58:53
【问题描述】:

我有一个大型 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 也很有效,但我没有时间研究如何去做。

【问题讨论】:

    标签: xml parsing sed


    【解决方案1】:

    这是我解决问题的方法:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-12-11
        • 2018-01-15
        • 2017-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 1970-01-01
        相关资源
        最近更新 更多