「12345」がxml全体の一意のIDである次の例を考えてみましょう。
<Tag 1>
a
b
c
d
12345
x
y
z
</Tag 1>
提供されたIDのXMLファイルを取得する<Tag 1>
には、私のファイルから「12345」をgrepし、それぞれ上下に移動するコマンドが必要です。</Tag 1>
ベストアンサー1
XML対応パーサーを使用して、XMLから直接値を選択できます。まず、XMLフラグメントを変更して有効にし、次の場所に配置しますfile.xml
。
<?xml version="1.0"?>
<Tag_1>
a
b
c
d
12345
x
y
z
</Tag_1>
(1)要素名がわかったら、このコマンドを使用して値を選択できます。
xmlstarlet select -t -v '//Tag_1' file.xml
出力(前の空行を含むXMLによる):
a
b
c
d
12345
x
y
z
要素タグ名が本当に必要な場合は、もう一度追加できます。
xmlstarlet select -t -e Tag_1 -v '//Tag_1' file.xml; echo
どちらの場合も、セレクタは要素//Tag_1
のすべての項目と一致しますTag_1
。より正確にするには、XPathセレクタを使用して使用する必要があります。たとえば、このコードスニペットには次のstuff
オプションがあります/root/item/Tag_1
。
<root>
<item><Tag_1>stuff</Tag_1></item>
<unwanted><Tag_1>nonsense</Tag_1></unwanted>
</root>
(2) 私は質問を間違って読んで、実際に欲しいものと一致する要素名が欲しいという事実にショックを受けました。この場合、より複雑な表現ただし、これにより、目的のテキストを含む直接要素名が提供されます12345
。
xmlstarlet select -t -m '//*[contains(text(), "12345")]' -m 'ancestor::*' -b -v 'name()' -n file.xml
出力
Tag_1
必要に応じて、このソリューションを使用して要素を識別し、以前のソリューションを使用してそのデータを抽出するか、このソリューションの表現を拡張してコンテンツを含めることができます。
xmlstarlet select -T -t -m '//*[contains(text(), "12345")]' -m 'ancestor::*' -b -v 'concat("<", name(), ">", ., "</", name(), ">")' -n file.xml
そうでない場合はxmlstarlet
標準パッケージであり、インストールが非常に簡単であることに注意してください。または、システム管理者にインストールを依頼してください。