2017-04-26 4 views
0

コマンドラインでxmlファイル(output.xmlという名前)からデータを抽出しようとしています。 、それをスクリプトに入れてください)。コマンドラインでXMLStarletを使用してXMLファイルからデータを抽出できない(名前空間制限)

これを行うためのより良いツールは、XMLStarletです。ただし、xmlstarlet sel -t -m "/entry/content" output.xmlは機能しません。

注:私はxmlstarlet el output.xmlのファイルのXpath構造をチェックしようとしました。それはツールが要素を見ることを意味します。


私はXMLStarletの仕事を作るための2つの条件があることを見た:

1- XMLファイルが整形式でなければなりません。 Stackoverflow related link

は、だから私はよく形成されたファイルを作成するには、このコマンドを適用:

xmlstarlet fo -R output.xml >> good-output.xml

2 - XMLは、既定の名前空間について非常にうるさいです。文書にその要素がある場合は、要素を選択する前に宣言するか、文書内の「xmlns」のすべての要素を削除します。 Stackoverflow related link

は、だから私がやった:

$ cat good-output.xml | sed -e 's/ xmlns.*=".*"//g' >> very-good-output.xml

をしかし、これらの2つのステップを実行し、私は別のエラーを持っている、と場所に私に...ターミナルポイントをそれを修正する方法がわかりません私は名前空間を削除し、 "コレクションの名前空間接頭辞のアプリケーションは定義されていません"と言います。私は何をすべきか?名前空間では機能しませんし、今度は再び私にそれらを置くように促します...

助けてください?

Screenshot of the original problem

Screenshot of the final problem

+0

さて、多分私は、なぜ、端末が私を非難されて理解してきました。エラーがあるタグは次のようになります。 「word:anotherword」 この表記は、このタグでxmlns属性が見つかるはずです。しかし、私はこれらの表記をどのように削除できるのか分かりません。私はREGEXを使用しなければならないと思うが、私はまだそのような行為をするのに慣れていない。 –

+0

文書で名前空間を定義している場合は、XPath式で接頭辞を使用できます。http://xmlstar.sourceforge.net/doc/UG/ch05.htmlも参照してください。 – npostavs

+0

ありがとう!私は 'xmlstarlet sel -t -m" // _:content "-cを使いました。 good-output.xml'とそれに対応するタグを与えました。唯一の問題は、タグの内容とタグの内容ではなくタグの内容のみが必要なことです。どうすればいいですか? –

答えて

1

だから、これは複数の名前空間を持つXMLファイルの内容を取得するための最終的な解決策である:

xmlstarlet sel -t -m "//_:content" -c . good-output.xml


npostavsは私を導くためにあなたに感謝。

私の最初の試みが私に希望のコンテンツの他にタグを与えたという事実は問題だと思っていましたが、実際は私の場合はありませんでした。それは他の誰かのためのケースであれば、これは続行する方法です:

xmlstarlet sel -t -m "/_:entry/_:content/text()" -c . output.xml

OR

xmlstarlet sel -t -m "/_:entry/_:content" -v . output.xml

簡体:

xmlstarlet sel -t -v "/_:entry/_:content" output.xml

+0

'xmlstarlet sel -t -v"/_:entry/_:content "output.xml' – npostavs

+0

これを単純化してテストしました。 –

0

のような問題があることに思えますこれは、xmlが別の名前空間を使用する場合に発生します。これらのケースでは、名前空間の問題を克服するための一つの解決策は、xmlstarletに要素の予想される名前空間の値を伝えることです:

xmlstarlet sel -N x='http://different.namespace.url/XMLSchema' -t -m '//x:YourElemHere' input.xml

関連する問題