2017-01-18 8 views
1

私のdbにインポートするスクリプトを実現するために、xmlファイルのノードの反復回数を数えたいと思います。 私はxmlstarletを使用しようとしたんだけど、彼は答えとして0を返すたびに...ここxmlstarletは常に0をカウントする

は私のXMLファイルのサンプルです:

:私はbashで

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> 
<global xmlns="http://www.xxxxxxxxxxx"> 
    <place geoAccuracy="0" geoStatus="0" geoLatDeg="0.0" geoLongDeg="0.0" id="123"> 
     <name>XXXXXX</name> 
     <postalcode>12345</postalcode> 
     <city>city</city> 
     <country>country</country> 
    </place> 
    <place geoAccuracy="0" geoStatus="0" geoLatDeg="0.0" geoLongDeg="0.0" id="123"> 
     <name>XXXXXX</name> 
     <postalcode>12345</postalcode> 
     <city>city</city> 
     <country>country</country> 
    </place> 

、私はこれをしませんでした

#!/bin/bash 
FILE="places.xml" RESULT=$(xmlstarlet sel -t -v "count(//place)" $FILE) 
echo $RESULT 

たびに、それが結果として0を返します...私は「//グローバル/場所」または「/場所」のような異なるXPathを試してみたが、結果は同じです...

誰にもそれを解決する方法? 私はUbuntuサーバー14.04LTSを使用しています。 O.R.Mapper @

+1

私はあなたがそれを代わりに 'lieu'の' place'言うように、あなたのXPathを変換するために忘れてしまったと思います(?) –

+1

にもかかわらず、多分あなたはxmlstarletのためにいくつかの名前空間のマッピングを指定する必要がありますか? –

+0

あなたは正しいです...私はプレゼンテーションで翻訳しませんでした...私は修正を行いました。しかし、この間違いは私のコードではなかった – Yvo

答えて

1

は正しいです:あなたはxmlstarletを使用するときに、名前空間を指定する必要があります。

xmlstarlet sel -N q="http://www.xxxxxxxxxxx" -t -v 'count(//q:place)' "$FILE" 
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    ^^ 

私のための作品(リターン2、私はあなたが提供する試験サンプルの最後に</global>を追加提供します)。

qは名前空間の参照に使用する名前で、http...xはXMLファイルのxmlns値です。次に、各タグ名の先頭に「q:」が追加され、名前空間が指定されます。 qの代わりに、名前空間—を参照する任意のIDを使用できます.URLは参照ではなく名前空間を定義します。

the docs

+0

それはあなたの両方にたくさんのことが、それは完全に実行されます! place'は、コマンドライン上の定義を気にすることなく動作するはずです: – Yvo

+0

より良いドキュメントのリンクは '_と説明している、http://xmlstar.sourceforge.net/doc/UG/ch05.htmlです。 – npostavs

関連する問題