web-dev-qa-db-ja.com

シェルスクリプトでXMLファイルを解析する方法

次の形式からデータを分割する方法を教えてください。

<datas>
 <data>
  <name>Name1</name>
 </data>
 <data>
  <name>Name2</name>
 </data>
</datas>

次の形式に:

<data><name>Name1</name></data>
<data><name>Name2</name></data>

解析されたデータは、次のようにPythonスクリプトに送信されます。

 python script.py <data><name>Name1<name></data>
 python script.py <data><name>Name2<name></data>

私は次のようなコマンドを試しました:

echo 'cat /datas/data' | xmllint --Shell file.xml

しかし、出力を目的の形式でPythonスクリプトに渡すにはどうすればよいですか?

4
Aryise

XMLStarlet でデータを前処理します。

$ xml sel -t -c '/datas/data' -nl data.xml
<data>
  <name>Name1</name>
 </data><data>
  <name>Name2</name>
 </data>

次に、それはあなたがどのようにPythonスクリプトがこのデータを読みたいかによって異なります。うまくいけば、それはファイルまたは標準入力からのものです...

5
Kusalananda

Xsltを使用します。

xsltスタイルシートは次のようになります

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/datas">
  <xsl:apply-templates select="data"/>
</xsl:template>

<xsl:template match="data">
  <data><name><xsl:value-of select="./name"/></name></data><xsl:text>&#xa;</xsl:text>
</xsl:template>

</xsl:stylesheet>

変換には、xsltprocプログラムを使用します。

入力ファイルの名前がin.xmlだとしましょう

xsltスタイルシートの名前はin.xsl

その後、呼び出しは

 xsltproc in.xsl in.xml

出力:

<?xml version="1.0"?>
<data><name>Name1</name></data>
<data><name>Name2</name></data>
5
murphy