簡體   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