適格:
読み取り専用権限がないため、XMLパーサーツールは使用できません。
私のバージョンのxmllintはxpathをサポートしていません。更新できず、読み取り専用です。
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
-00
Perlには、レコード(「行」)が単一の文字ではなく空の行に分かれている素晴らしい「段落モード」()があります\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