3

私の質問には2つの質問が含まれていることを知っています...

まず、xmllint を使用して "loc" コンテンツ タグを出力します。ロードしたサイトマップには xmlns="..." があります。

xmllint シェルでは、これを行う必要があります。

setrootns
xpath //defaultns:loc

それはうまくいきます...問題ありません。しかし、これを bash スクリプトで行う必要があります。

(AFAIK)xmllintには「行こう、setrootns」と伝えるオプションがないため、これを行うことはできません:

xmllint --xpath "//loc" sitemaps.xml
# or
xmllint --xpath "//defaultns:loc" sitemaps.xml

これが最初の質問です。どうすれば xmllint にデフォルトの ns をロードするように指示できますか?

できない場合は、2 番目の解決策を見てみましょう。

xmlns 属性を削除すると、使用する ns がなくなります。

xmllint --xpath "//loc" <(sed -r 's/xmlns=".*?"//' sitemaps.xml)

しかし...今... 500個の「loc」コンテンツの応答全体が1行に連結されています!...

私もこれを試しました:

xmllint --shell sitemaps.xml <<EOF
setrootns
xpath //defaultns:loc/text()
EOF

またはもう一度

xmllint --shell sitemaps.xml <<EOF
setrootns
cat //defaultns:loc
EOF

最初は私に与えます(たとえば)

465  TEXT
    content=http://... 

切り捨てられた URL

2番目は、2行ごとに「------」...そして最後の行に「/>」が表示されます...

そして、私はとても緊張し始めます... :)

解決策が見つかった場合は、どうもありがとうございます。

目標は、1 行に 1 つずつ、すべての場所を設定することです。

4

3 に答える 3

5

@BrnVrn は正しいです。タグの後に「\n」を追加するだけで済みました

次に、名前空間に関する私の答えを見つけました。ローカル名を使用して、デフォルトの名前空間をチェックしないようにすることができます

だから、私はこれをしました:

xmllint  --xpath "//*[local-name()='loc']/text()" <(sed 's/<loc>/<loc>\n/g' sitemaps.xml)

そしてそれは動作します!

ありがとうございます

于 2013-02-06T17:18:35.743 に答える
4

私は似たようなことをしていました:

clean_xml_message=$(echo "$xml_message" | sed 's/xmlns/ignore/')

最終的には、新しい行を元に戻すことができます:

sed 's/></>\n</g' 

<loc></loc>?なしの URL のみが必要だと思います。次に、xmllint を使用してすべての loc 要素を選択します。

<loc>...</loc><loc>...</loc><loc>...</loc>

次に、新しい行を追加します。sed 's/<loc>/<loc>\n/g' | sed 's#</loc>#\n</loc>#g'

<loc>
...
</loc><loc>
...
</loc><loc>
...
</loc>

最後にタグを削除するgrep -v "<loc>" |grep -v "</loc>"か、1grep -v "$<"つでそれを行うことができます。(-v は反転選択です: http://unixhelp.ed.ac.uk/CGI/man-cgi?grep )

于 2013-02-06T11:38:21.143 に答える