特定の要素を含むXMLノードの削除

特定の要素を含むXMLノードの削除

この要素を含むKMLファイルからすべてのアイコンを削除したいと思います<tessellate>。次のブロックは完全削除:

<Placemark>
    <styleUrl>#m_ylw-pushpin330</styleUrl>
    <LineString>
        <tessellate>1</tessellate>
        <coordinates>
            0.0000000000000,0.0000000000000,0 0.0000000000000,0.0000000000000,0
        </coordinates>
    </LineString>
</Placemark>

私は貪欲ではないPerl正規表現を試しましたが、成功しませんでした(多くのものが最初のものと一緒に削除されました<Placemark>)。

sed -r ':a; N; $!ba; s/\n\t*//g' myplaces.kml |
perl -pe 's|<Placemark>.*?<tessellate>.*?</Placemark>||g'

私はXMLパーサーが行く方法だと思いますが、xmlstarletに関するドキュメントを読んでいましたが、何も見つかりませんでした。したがって、xmlstarlet、pythonなどのソリューションも大歓迎です!

ベストアンサー1

そしてxmlstarlet

xmlstarlet ed -d '//Placemark[.//tessellate]' < myplaces.kml

名前空間を使用するときは、kmlまずそれを定義する必要があります(参照: xmlstarlet ドキュメント)

xmlstarlet ed -N 'ns=http://www.opengis.net/kml/2.2' -d '//ns:Placemark[.//ns:tessellate]'

を使用するには、perlファイルを1行ずつ処理せずに全体的に処理し、sにフラグを追加する必要がありますs///。それにもかかわらず、非欲張りな一致を使用しても、最初の項目から次の項目まで一致します。次のもの<Placemark>。したがって、次のように書く必要があります。</Placemark><tessellate>

perl -0777 -pe 's|(<Placemark>.*?</Placemark>)|
   $1 =~ /<tessellate>/?"":$1|gse'

おすすめ記事