2016-10-28 10 views
0

でXML属性の追加:は、私は次のような形式のXMLデータを持つバッシュ

<string name="app_name">my App</string> 
<string name="yes">Yes</string> 
<string name="no">No</string> 
<string name="done">Done</string> 

私はこのような何かにXMLを変換するためのbashスクリプトを記述しようとしている:

<string comment="for more see http://www.web.com/test/app_name" name="app_name">my App</string> 
<string comment="for more see http://www.web.com/test/yes" name="yes">Yes</string> 

私はいくつかの検索をしました。ここまで私が見つけたものがあります。

コードは以下の交換を行っているが、すべての要素です:

sed -i 's/<string/<string comment=\"for more see http:\/\/www\.web\.com\/test\/\" /g' string.xml 

そして、この表現はname属性をフェッチ:

Sname=$(sed '/name/s/\(.*name=\)\(.*\)/\2/' string.xml|awk -F\" '{print $2}') 

しかし、私はそれらをマージする方法は考えています。

答えて

1

sedまたはawkをXML解析に使用することは危険です。これらのツールは非常に柔軟ですが、組み込みのXML解析機能はありません。 sedまたはawkにXMLパーサーを実装するのは非常に退屈で実用的ではありません。私はxmlstarlet(実際にはパーサ以上のもの)のようなXMLパーサを使うことをお勧めします。

xmlstarlet ed -a '//string[@name]' -t attr -n comment src.xml | \ 
    xmlstarlet ed -u '//string/@comment' \ 
    -x 'concat("see http://www.web.com/test/app_name/", ../@name)' > out.xml 

最初xmlstarletコマンドは、src.xmlファイルを解析('//string[@name]'XPath式を使用して)name属性を有する全てstringタグに空comment属性を付加します。コマンドの出力は、pipeline|)を介して2番目のコマンドに渡されます。

2番目のコマンドは、パイプラインからXMLを読み取り、特に、name属性の値を持つ静的ストリング"see http://www.web.com/test/app_name/"(親ノードの「name属性の../@nameスタンドを連結し、concat()機能をcomment属性を更新します ")。

第2のコマンドの出力はredirectedout.xmlです。

サンプル入力

<root x="10"> 
    <string name="app_name">my App</string> 
    <string name="yes">Yes</string> 
    <string name="no">No</string> 
    <string name="done">Done</string> 
</root> 

サンプル出力

<?xml version="1.0"?> 
<root x="10"> 
    <string name="app_name" comment="see http://www.web.com/test/app_name/app_name">my App</string> 
    <string name="yes" comment="see http://www.web.com/test/app_name/yes">Yes</string> 
    <string name="no" comment="see http://www.web.com/test/app_name/no">No</string> 
    <string name="done" comment="see http://www.web.com/test/app_name/done">Done</string> 
</root> 
+0

やあ、完璧なソリューションのおかげで、私はxmlstarletするXMLを変更し、それが魅力のように働いています。可能であれば、学習のためにそれがどのように動作するか、パラメータと説明を説明できますか? – user2299735

+0

@ user2299735、いくつかの追加情報が追加されました。あなたの問題が解決したと思ったら、答えを受け入れてください。 –

関連する問題