2012-05-26 54 views
1

我正在尋找解決這個問題的方法,並且懷疑awk應該提供一個簡單的解決方案,而不是我笨拙的shell腳本。可以刪除XML文件部分

我有一個由多個部分組成的xml文件,如下所示。我也有一個值列表。

對於每個部分<top_tag> ... </top_tag>其中value_x是我的列表中,刪除(即:不打印)的部分<top_tag> ... </top_tag>

<xml> 
<outer_tag> 
    <top_tag> 
     <tag>value_1</tag> 
     <other_tags></other_tags> 
    </top_tag> 
    <top_tag> 
     <tag>value_2</tag> 
     <other_tags></other_tags> 
    </top_tag> 
    ... 
    <top_tag> 
     <tag>value_n</tag> 
     <other_tags></other_tags> 
    </top_tag> 
</outer_tag> 

您的建議將最讚賞。

+1

您將需要使用XML解析模塊在Python或Perl或命令行實用程序,如'xmlstarlet'。 –

+0

你是指什麼節? 'outer_tag','top_tag','tag'或其他一些分組? – Edwin

回答

2

這裏你需要的不是awk,而是XSLT,它是專門爲這類任務而創建的。它可以讓你將XML文檔轉換成不同的XML。

對於輸入很像你:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="example.xsl"?> 
<outer_tag> 
    <top_tag> 
     <tag>value_1</tag> 
     <other_tags></other_tags> 
    </top_tag> 
    <top_tag> 
     <tag>value_2</tag> 
     <other_tags></other_tags> 
    </top_tag> 
    <top_tag> 
     <tag>value_3</tag> 
     <other_tags></other_tags> 
    </top_tag> 
    <top_tag> 
     <tag>value_n</tag> 
     <other_tags></other_tags> 
    </top_tag> 
</outer_tag> 

以下XSLT通過簡單地不是抄襲他們,忽視他們的內容刪除所有top_tag元素與value_3

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="*"> 
     <xsl:element name="{name()}">   
      <xsl:apply-templates select="child::node()"></xsl:apply-templates> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="top_tag[tag = 'value_3']">  
    </xsl:template> 
</xsl:stylesheet 

每種主流編程語言都至少有一對庫,可以根據XSLT處理XML輸入。命令行工具和基於UI的應用程序(IDE,但不僅僅是這些)也可以做到這一點。最後,Web瀏覽器可以將使用XSLT文件,如果你有像這樣的處理指令的XSL文件:

<?xml-stylesheet type="text/xsl" href="example.xsl"?> 
2

這可能會爲你工作:

sed -i '/<top_tag>/,/<\/top_tag>/!b;/<top_tag>/{h;d};H;/<\/top_tag/!d;x;/<tag>value.*<\/tag>/d' file 
+0

它很完美,但如果你能解釋它是如何工作的,它也會很棒=) – Scadge