
次のXMLファイルがあります。
<?xml version="1.0" encoding="utf-8"?>
<deviceID>IO238470374109730497</devicdeID>
<KeyValuePairs>
<KeyValuePair>
<BASE-URL>2</BASE-URL>
<Key>2</Key>
<Value>2</Value>
</KeyValuePair>
<KeyValuePair>
<BASE-URL>3</BASE-URL>
<Key>3</Key>
<Value>3</Value>
</KeyValuePair>
</KeyValuePairs>
この部分だけを取り除きたいです。
<KeyValuePair>
<BASE-URL>3</BASE-URL>
<Key>3</Key>
<Value>3</Value>
</KeyValuePair>
私が達成したいのは、内部のコンテンツを削除し、これらの<KeyValuePair>
特定の、と<BASE-URL>
。タプルは常にユニークで繰り返しはありませんが、1つ以上にすることができます。<Key>
<Value>
<KeyValuePair>
Bashを使ってこれを行うにはどうすればよいですか?
答え1
あなたの例は有効なXMLファイルではありません。<root/>
文書の周りに要素を追加し、閉じるタグの誤字を修正して</deviceID>
少し変更しました。
<?xml version="1.0" encoding="utf-8"?>
<root>
<deviceID>IO238470374109730497</deviceID>
<KeyValuePairs>
<KeyValuePair>
<BASE-URL>2</BASE-URL>
<Key>2</Key>
<Value>2</Value>
</KeyValuePair>
<KeyValuePair>
<BASE-URL>3</BASE-URL>
<Key>3</Key>
<Value>3</Value>
</KeyValuePair>
</KeyValuePairs>
</root>
これで、XML編集ツールを使用してXMLを編集できるようになりました。このXPath式は、テキスト値を含むxmlstarlet
XML要素(およびその内容)が削除されることを示します<KeyValuePair/>
。<BASE-URL/>
3
xmlstarlet ed -d '//KeyValuePair[BASE-URL/text()="3"]' /tmp/500185.xml
出力は次のとおりです
<?xml version="1.0" encoding="utf-8"?>
<root>
<deviceID>IO238470374109730497</deviceID>
<KeyValuePairs>
<KeyValuePair>
<BASE-URL>2</BASE-URL>
<Key>2</Key>
<Value>2</Value>
</KeyValuePair>
</KeyValuePairs>
</root>