複数回抽出して最初のXMLタグを削除する

複数回抽出して最初のXMLタグを削除する

小さいサイズのXMLファイルがあります。すでに情報があるので、XMLタグ間でいくつかの値を抽出するだけです。XML私のコンピュータにはパーサーユーティリティがないからです。私は代替を探しています。

<capacity> </capacityまず、重複したXMLタグがあります。 >NXMLファイルの時刻番号とこのXMLタグの間には他の多くのタグがあります。

<capacity> </capacity>XMLタグの各項目を個別にインポートし、それを解析してその下の値を抽出する必要があります。

<subcolumns><capacity><name>45.90</name>
<index>0</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
<capacity><name>57.09</name>
<index>1</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
<capacity><name>55</name>
<index>2</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
</subcolumns>

だから私が考えるロジックは、XMLタグの最初の項目を見つけて一時<capacity> </capacity>ファイルに印刷してから最初の項目を削除することです。

<capacity><name>45.90</name>
<index>0</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>

次に、操作が2回目に実行されると、<capacity> </capacity>新しいXMLタグのペアが考慮されます。したがって、<capacity> </capacity>最後のタグが見つかるまでこの操作を数回繰り返す必要があります。この部分のデータは抽出されるたびに変更され、抽出が可能です。

<capacity> </capacity>今私が望むのは、デフォルトのXMLファイルからXMLタグの最初の項目を選択して一時ファイルとして印刷し、その部分を削除することです。

これは私が試したものですが、何も機能しません。

sed -n '2,${/<capacity>\(.*\)<\/capacity>/\1/p;q;}' "<input XML file>" >> temp.txt

私の追加のアイデアは、一時ファイルをインポートしてタグの下に必要な値を処理して抽出することですcapacity。私はこれのためのロジックを書いて、うまくいきます。

ベストアンサー1

XMLパーサーを使用することは、XML文書を操作する正しい方法です。

xmlstarlet解決策:

xmlstarlet sel -t -c '//capacity[1]' -n yourxml > temp.txt 
&& xmlstarlet ed -d '//capacity[1]' yourxml > tmp.xml && mv tmp.xml yourxml 

cat temp.txt
<capacity><name>45.90</name>
<index>0</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>

  • xmlstarlet sel -t -c '//capacity[1]' -n yourxml > temp.txt- 最初のcapacityタグ宣言を抽出し、出力を次にリダイレクトします。temp.txt

  • xmlstarlet ed -d '//capacity[1]' yourxml > tmp.xmlcapacity- 文書から最初のタグを削除し(-d削除操作によって)、変更された文書の内容を一時ファイルにリダイレクトします。tmp.xml

  • mv tmp.xml yourxml- 初期のXML文書を修正版に置き換える

おすすめ記事