2

XMLファイルの一部をループしようとして問題が発生しました。Rails3でノコギリを使用しています。

私はこのXMLフィードを読んでいます-http ://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml

これが私のコードです:

def save_rates

    # get the XML data form ECB URL
    file_handle = open('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml')

    # get document xml string and create Nokogiri object
    doc = Nokogiri::XML(file_handle)

    # foreach date...
    doc.xpath("//Cube/Cube").each do |cube|

        raise cube.inspect # isn't being executed

        # foreach currency...
        cube.xpath("./Cube").each do |curr|
            # create DB entry
            Exchange.create(:currency=>curr.currency, :rate=>curr.rate, :record_date => cube.time)

        end
    end

end

調べdocてみると、のこぎりオブジェクトが見えます。ただしcube.inspect、最初の.eachループ内でレイズしようとすると、起動しません。だから、私の道が間違っていると私は信じるようになりました://Cube/Cube

Nokogiriチュートリアルで見た他の例から、パスはそれに似ています。私の道は間違っていますか、それとも私がここで間違ったことをしたことがありますか?

私はルビーn00bですので、気楽に行ってください!

アップデート

XMLの形式は次のとおりです

<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
    <gesmes:subject>Reference rates</gesmes:subject>
    <gesmes:Sender>
    <gesmes:name>European Central Bank</gesmes:name>
    </gesmes:Sender>
    <Cube>
        <Cube time="2013-02-25">
            <Cube currency="USD" rate="1.3304"/>
            <Cube currency="JPY" rate="125"/>
            <Cube currency="BGN" rate="1.9558"/>
            <Cube currency="CZK" rate="25.52"/>
            <Cube currency="DKK" rate="7.4614"/>
            <Cube currency="GBP" rate="0.8789"/>
            ...
        </Cube>
        <Cube>
        <Cube time="2013-02-24">
            <Cube currency="USD" rate="1.3304"/>
            <Cube currency="JPY" rate="125"/>
            <Cube currency="BGN" rate="1.9558"/>
            <Cube currency="CZK" rate="25.52"/>
            <Cube currency="DKK" rate="7.4614"/>
            <Cube currency="GBP" rate="0.8789"/>
            ...
        </Cube>
    </Cube>
</gesmes:Envelope>
4

1 に答える 1

4

ここでの問題は、XML 名前空間が原因です。

XML のルート属性にはxmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"、デフォルトの名前空間を指定する属性があります。Cube要素はこの名前空間にあり、名前空間を指定せずに使用するCubeと一致しません。

Nokogiri で名前空間を指定するには、次のようにします。

doc.xpath("//ecb:Cube/ecb:Cube", 'ecb' => "http://www.ecb.int/vocabulary/2002-08-01/eurofxref")

ここでは、名前空間に prefix を指定ecbし、XPath 式でプレフィックスを使用しています。

この場合、名前空間がルート ノードで宣言されたデフォルトの名前空間である場合、Nokogiri はxmlnsプレフィックスでそれを宣言するので、より単純なものを使用できます。

doc.xpath("//xmlns:Cube/xmlns:Cube")

これは、最初と同じ結果になります。

名前空間に興味がない場合、さらに簡単な方法は次のremove_namespaces!メソッドを使用することです。

doc.remove_namespaces!
doc.xpath("//Cube/Cube")

名前空間情報が削除されているため、この結果は最初の 2 つの例とまったく同じではありませんが、期待どおりのノードが得られます。

于 2013-02-25T15:00:07.260 に答える