15

次の HTML コードがあります。

<textarea name="command" class="setting-input   fixed-width" rows="9">1</textarea><textarea name="command" class="setting-input   fixed-width" rows="5">2</textarea>

そのような出力を受け取るためにそれを解析したいと思います:

1
2

現在私は使用しています:

xmllint --xpath '//textarea[@name="command"]/text()' --html

ただし、各一致の後に改行を追加しません。

4

5 に答える 5

1

私は次の醜いトリックを行いました。より良い解決策を自由に提供してください。

次のコマンド</textarea>を使用して、HTML コードを置き換えて変更しました。\n</textarea>

sed 's/\<\/textarea/\'$'\n\<\\/textarea/g' f
于 2013-08-30T13:05:46.763 に答える
0

改行は xml データに正当に表示されます。より堅牢なアプローチでは、XML データに出現しないことが保証されている文字で xpath の結果を区切ります。Universal Coded Character SetNull 文字U+0000 は、このような文字です。

null 制御文字に割り当てられたコード ポイント U+0000 は、XML 1.0 および 1.1 ドキュメントで常に無効な Unicode および ISO/IEC 10646 でエンコードされた唯一の文字であることに注意してください。
https://en.wikipedia.org/wiki/Valid_characters_in_XML

@Cyker のマージ要求には、 xpath の結果を NUL で区切るオプションxmllintの追加が含まれていました。この機能の新機能リクエストも公開されました。-xpath0

うまくいけば、xmllintこの機能はすぐに得られます。

もう 1 つの xpath コマンド ライン ツールでxmlstarletある を利用して、この目標を達成することができます。xmlstarletは現在、NUL の出力を直接サポートしていませんが、U+FFFFNUL と同様に、XML データでは発生しないことが保証されている output にすることができます。( Universal Coded Character Setの UTF-8 エンコーディングを想定しています。)次に、変換U+FFFFする必要があるだけU+0000で、NUL で区切られた xpath の結果が得られます。

次の例では、次の部分的な html ファイルを使用します。テスト目的で改行を追加したことを除いて、質問と同じデータです。

cat > data.html <<'EOF'
<textarea name="command" class="setting-input fixed-width" rows="9">1 
 newline</textarea>
<textarea name="command" class="setting-input fixed-width" rows="5">2 
 newline</textarea>
EOF

以下は、xpath の結果を NUL で区切るワンライナーの使用方法xmlstarletですperl

xmlstarlet fo -H -R data.html \
| xmlstarlet sel -t -m '//textarea[@name="command"]' -v '.' -o $'\uffff' \
| perl -C -0xFFFF -l0 -pe ''

注: xmlstarlet fo -H -R@TheDudeAbides の回答に示すように、HTML を実行しました。

xpath の結果が NUL で区切られたので、 を使用して結果を処理できますxargs -0。例:

xmlstarlet fo -H -R data.html \
| xmlstarlet sel -t -m '//textarea[@name="command"]' -v '.' -o $'\uffff' \
| perl -C -0xFFFF -l0 -pe '' \
| xargs -0 -n 1 printf '%q\n'

結果:

'1 '$'\n'' newline'
'2 '$'\n'' newline'

または bash 配列にロードします。

mapfile -t -d '' a < <(
 xmlstarlet fo -H -R data.html \
 | xmlstarlet sel -t -m '//textarea[@name="command"]' -v '.' -o $'\uffff' \
 | perl -C -0xFFFF -l0 -pe ''
)

declare -p a

結果:

declare -a a=([0]=$'1 \n newline' [1]=$'2 \n newline')
于 2021-07-09T01:38:46.607 に答える