2017-04-12 5 views
0

タグの値に基づいてタグの値を解析して抽出するには、次のXMLがあります。 type == 'hosted'の場合のみ抽出します。私はgrep、sed、awkのようなbashツールを使って抽出したいと思います。条件なしで1つのタグ値を抽出することは、条件付きではなく前に行ったことです。私は簡単にそれがPythonまたは私が知っている他のプログラミング言語を使用して取得することができます。しかし、これはシェルスクリプトで実行するのが理想的です。grep、awk、sedのようなシェルツールを使ってxmlを解析する

... 
    <repositories-item> 
     <name>hosted-npm</name> 
     <type>hosted</type> 
    </repositories-item> 
    <repositories-item> 
     <name>proxied-npm</name> 
     <type>proxied</type> 
    </repositories-item> 
... 
+1

XMLツールを使用してXMLを処理することをお勧めします(Pythonなどでも)。特に、適切なXSLTスタイルシートを作成し、スクリプトから 'xsltproc'などのコマンドを使用してXML入力にスタイルシートを適用することを検討することができます。 –

+0

[xmlstarlet](http://xmlstar.sourceforge.net/)をチェックアウト –

答えて

0

欠けているのxml特定のツールのレコードを定義するために、囲みタグを使用して救助に

awkが、これはどのGNU awkサポートするマルチchar型のRSが必要であることを

$ awk -v RS='</?repositories-item>' '/<type>hosted<\/type>/' file 

    <name>hosted-npm</name> 
    <type>hosted</type> 

ノートをデリミタ。

あなたが試合でより多くのコントロールを持つことができ、出力

$ awk -v RS='</?repositories-item>' -F'[<>]' ' 
    {delete a; 
    for(i=2;i<=NF;i+=4) a[$i]=$(i+1); 
    if(a["type"]=="hosted") print a["name"] }' file 


hosted-npm 
3

xmlstarletは、コマンドラインスイッチの短いシーケンスとして、複雑なXSLTテンプレートを表現することができ、コマンドラインのXMLツールキットです。あなたは以下のスイッチ

$ cat repos.xml | xmlstarlet sel -t -m '//repositories-item' \ 
       -i 'type="hosted"' -v 'name' -n 

でXMLStarletフィルターを通してそれを実行した場合、我々は整形式のXML文書が設けられていると仮定

repos.xml

<repositories> 
    <repositories-item> 
     <name>hosted-npm</name> 
     <type>hosted</type> 
    </repositories-item> 
    <repositories-item> 
     <name>proxied-npm</name> 
     <type>proxied</type> 
    </repositories-item> 
</repositories> 

あなたは出力

の1行を取得します ​​

XMLStarletコマンドliを見てみましょうne。我々は我々が-m swicthで指定//repositories-itemテンプレートと<repositories-item>要素にパーサを制限-tスイッチ

  • と選択テンプレートを指定selスイッチ
  • で指定されたセレクトモードでコマンドを実行し

    1. -iスイッチで指定されたtype要素の値が "ホストされている"要素のみを選択します。
    2. スイッチで指定されたname要素の値を出力します。
    3. 各出力行の後に、-nスイッチで指定された改行を出力します。

      xmlstarlet sel -C -t -m '//repositories-item' \ 
           -i 'type="hosted"' -v 'name' -n > hosted-repos.xslt 
      

    ここでは、このXSLT仕様は-Cオプションを使用してXMLStarletで生成できることは注目に値するXMLStarlet

    <?xml version="1.0"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" version="1.0" extension-element-prefixes="exslt"> 
        <xsl:output omit-xml-declaration="yes" indent="no"/> 
        <xsl:template match="/"> 
        <xsl:for-each select="//repositories-item"> 
         <xsl:choose> 
         <xsl:when test="type=&quot;hosted&quot;"> 
          <xsl:call-template name="value-of-template"> 
          <xsl:with-param name="select" select="name"/> 
          </xsl:call-template> 
          <xsl:value-of select="'&#10;'"/> 
         </xsl:when> 
         </xsl:choose> 
        </xsl:for-each> 
        </xsl:template> 
        <xsl:template name="value-of-template"> 
        <xsl:param name="select"/> 
        <xsl:value-of select="$select"/> 
        <xsl:for-each select="exslt:node-set($select)[position()&gt;1]"> 
         <xsl:value-of select="'&#10;'"/> 
         <xsl:value-of select="."/> 
        </xsl:for-each> 
        </xsl:template> 
    </xsl:stylesheet> 
    

    パーチャールズダフィー提案によって生成された同等のXSLTです

    この生成されたXSLT仕様は、xsltprocと直接使用することができます。

    cat repos.xml | xsltproc hosted-repos.xslt - 
    
  • +2

    xsltprocを使用してそのXSLTを適用する方法をOPに示す価値があるかもしれません。 XMLStarletをインストールしないでください。 –

    関連する問題