Xml

xmlstarletを使用して別の要素の下に新しい要素を挿入するにはどうすればよいですか?



How Insert New Element Under Another With Xmlstarlet



解決:

同様の問題がありました。Tomcat構成ファイル(server.xml)があり、挿入する必要がありました。事前定義された属性を持つタグをセクション。

以前は次のようになりました。



  

これが私が達成したかったことです:

  

これが私がそれをした方法です(シェルスクリプトからの抜粋):



if [-n '$(xmlstarlet sel -T -t -v' / Server / GlobalNamingResources / Resource [@ name = 'jdbc / templateassets'] / @ name'server.xml) ']; then echo'server.xmlですでに定義されているリソースjdbc / templateassets'else echo'server.xmlにリソースjdbc / templateassetsを追加しています 'xmlstarlet ed -P -S -L -s / Server / GlobalNamingResources -t elem -n ResourceTMP -v ''  -i // ResourceTMP -t attr -n'name '-v'jdbc / templateassets'  -i // ResourceTMP -t attr -n'auth '-v'Container'  -i // ResourceTMP -t attr -n'type '-v'javax.sql.DataSource'  -i // ResourceTMP -t attr -n'driverClassName '-v'com.mysql.jdbc.Driver'  -i // ResourceTMP -t attr- n'url '-v'jdbc:mysql:// DBHOST:DBPORT / DBNAME?createDatabaseIfNotExist = false&useUnicode = true&characterEncoding = utf-8'  -i // ResourceTMP -t attr -n'username '-v'DBUSER' - i // ResourceTMP -t attr -n'password '-v'DBPASS'  -i // ResourceTMP -t attr -n'maxActive '-v' 150 ' -i // ResourceTMP -t attr -n'maxIdle' -v '10'  -i // ResourceTMP -t attr -n'initialSize '-v' 10 ' -i // ResourceTMP -t attr -n'validationQuery' -v'SELECT 1 ' -i // ResourceTMP -t attr -n'testOnBorrow '-v'true'  -r // ResourceTMP -v Resource  server.xml fi

秘訣は、新しい要素に一時的に一意の名前を付けて、後でXPATH式で見つけられるようにすることです。すべての属性が追加された後、名前はResourceに戻されます(-rを使用)。

他のxmlstarletオプションの意味:

-P(または--pf)-元のフォーマットを保持します-S(または--ps)-重要でないスペースを保持します-L(または--inplace)-ファイルをインプレースで編集します 

使用する-s(または--subnode)の代わりに-私。ボーナスに関しては、属性を持つ要素を直接挿入することはできませんが、すべての編集操作は順番に実行されるため、要素を挿入してから属性を追加するには、次のようにします。



> xml ed -s / config -t elem -n sub -v '' -i / config / sub -t attr -n class -v com.foo test.xml   

XMLStarletのバージョン1.4.0(2012年8月26日付け)から、次を使用できます。$ prev(または$ xstar:prev)への引数として-私、-a、および-sは、最後に挿入されたノードセットを参照します。ファイル内のXMLStarletソースコードの例を参照してくださいdoc / xmlstarlet.txt、例/ ed-backref1、examples / ed-backref2、およびexamples / ed-backref-delete。一時的な要素名で要素を挿入し、最後に名前を変更するというトリックを使用する必要がなくなりました。例examples / ed-backref2は、以前に作成されたメモを参照するために使用する変数を定義する方法を示すのに特に役立ちます。これにより、次のようなトリックを行う必要がなくなります。$ prev / ..ノードから「ナビゲート」します。