kshスクリプトを使用してxmlファイルの汎用xml型ブロックを属性型文字列に変換する方法

kshスクリプトを使用してxmlファイルの汎用xml型ブロックを属性型文字列に変換する方法

適格:

  1. 読み取り専用権限がないため、XMLパーサーツールは使用できません。

  2. 私のバージョンのxmllintはxpathをサポートしていません。更新できず、読み取り専用です。

  3. xmlstarletがないためインストールできません。

私のオプションは文字列処理にほとんど制限されています。

ユーザーはブロック名になる入力パラメーターを提供します。

だから、

仮定しましょう

NAME=${USER_INPUT}

$NAME検索するxmlブロックを検索するためのパラメータとして使用します。

次のように、xmlファイルからこれらの一般的なxmlブロックをどのように変換できますか?

<block>
 <name>Bob</name>
 <address>USA</address>
 <email>[email protected]</email>
 <phone>1234567</phone>
</block>

<block>
 <name>Peter</name>
 <food>France</address>
 <cell>[email protected]</cell>
 <drinks>Coke</drinks>
 <car>Honda</car>
 <bike>Mountain bike</bike>
</block>

だからここで達成したいのは、私の検索を満たすXMLの塊を得ることです。

例えばNAME=Bob;

スクリプトの出力は属性ファイル形式でなければなりません。

name=Bob
address=USA
[email protected]
phone=1234567

ここで考慮すべき1つのことは、xml形式がブロックごとに異なることです。各 xml ブロッ​​クのノードは異なります。

答え1

-00Perlには、レコード(「行」)が単一の文字ではなく空の行に分かれている素晴らしい「段落モード」()があります\n。これにより、非常に簡単に関連レコードを抽出できます。したがって、最初に各前に空白行があることを確認してから、<block>段落モードを使用して検索したいものを見つけます。

$ sed 's/<block>/\n<block>/' file | perl -00ne 'if(/<name>\s*bob\s*<\/name>/i){print}'
<block>
 <name>Bob</name>
 <address>USA</address>
 <email>[email protected]</email>
 <phone>1234567</phone>
</block>

これでシェルスクリプトをパッケージ化します(ここではbashが使用されます)。

#!/bin/ksh

## Read the search strings
tag="$1"
value="$2"
target="file.xml" ## change this to whatever your xml file is called

## Search
sed 's/<.\?block>/\n/' "$target" |
    perl -00ne "if(/<$tag>\s*$value\s*<\/$tag>/i){
                   ## May as well do the formatting in Perl as well
                   s# *<([^/]+?)>#\1=#g;
                   s/<\/.+?>//g;
                   print
                 }"

次に、タグ名と希望の値を入力として指定してスクリプトを実行します。

$ a.sh "name" "bob"
name=Bob
address=USA
[email protected]
phone=1234567

関連情報