0

サンプル XML タグからユーザー名とパスワードの値を取得する必要がある

<CommCellUser userName="~!@#$%^&*()_+`1=- 23)()();';" password="":>?<,./;'|}{[]  ><:"/" </CommCellUser>

値は二重引用符で囲みます。その値には、二重引用符と、スペースを含むその他の特殊文字を含めることができます。

comm_cell_line=`grep "CommCellUser" /filename | head -1`
userName=`echo "$comm_cell_line" | awk '{print $2}' | cut -d"\"" -f2`
passwd=`echo "$comm_cell_line" | awk '{print $3}' | cut -d"\"" -f2`

このようなフェッチは、非常に多くのケースを逃します。値にスペースや特殊文字が含まれている可能性があるためです。

助けてください 。

4

2 に答える 2

0

次のソリューションでは、 userNameおよびpassword属性に渡される文字列をエンコードして、XML 文字列が有効と見なされるようにします。

#!/bin/bash

XML="<CommCellUser userName='~!@#$%^&amp;*()_+``1=- 23)()();&#39;;' password='&quot;:&gt;?&lt;,./;&#39;|}{[]  &gt;&lt;:&quot;/'></CommCellUser>"

USER=`echo $XML | xmllint --xpath "string(/CommCellUser/@userName)" -`
PASS=`echo $XML | xmllint --xpath "string(/CommCellUser/@password)" -`

echo username=$USER
echo password=$PASS

次の出力が生成されます。

username=~!@#$%^&*()_+1=- 23)()();';
password=":>?<,./;'|}{[] ><:"/

データを解析しているため、受信データが有効であると想定できます。xmllint コマンドを使用して、このチェックを実施できます。

ノート:

于 2012-11-22T19:58:56.717 に答える
0

あなたの例のパスワード値がタイプミスであることを願っています。そうしないと、xml に問題が発生する可能性があります。そのため、パスワード値から二重引用符を削除しました。以下のテストを見てください。grep は、テキストから何かを取得するための友達です。

kent$  echo $comm_cell_line                                           
<CommCellUser userName="~!@#$%^&*()_+`1=- 23)()();';" password="quote removed:>?<,./;'|}{[]  ><:"/" </CommCellUser>

kent$  userName=$(grep -Po '(?<=userName=")[^"]*' <<<$comm_cell_line )

kent$  pwd=$(grep -Po '(?<=password=")[^"]*' <<<$comm_cell_line )     

kent$  echo $userName                                                 
~!@#$%^&*()_+`1=- 23)()();';

kent$  echo $pwd     
quote removed:>?<,./;'|}{[]  ><:
于 2012-11-22T22:28:43.030 に答える