2015-06-21 75 views
0

我有一個很大的xml文件,需要使用預定義的格式加載到列表中。它有許多子元素是這樣的:使用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也很有效,但我沒有時間去研究如何去做。

回答

1

這裏是我解決了這個問題:

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

我已經使用TR替代所有的LF帶我知道沒有出現在我的文件(±)一個字符,然後搜索的結束標記後跟通過±開頭,然後用「;」代替。然後我再次使用tr來恢復LF。

通過將sed輸出管道連接到另一個sed替換,您可以「拼合」儘可能多的標籤,這正是我需要的,因爲我需要拼合幾個標籤。這使我的文件中的行減少了95%,使得其餘的解析非常簡單。

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> 

和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)