-1

NodeSetを返す必要があるxpathクエリを実行しているNokogiriノードがあります。代わりに文字列を返します。xml ソースを確認したところ、データには多くの要素ではなく 1 つの要素しか含まれていないことがわかりました。

String ではなく、値が 1 つだけの NodeSet を返すべきではありませんか? どうすればこれに対処できますか?

以下は、2 つのエントリを持つ NodeSet を正しく返す疑似xml です。

<root>
    <products>
        <product>
            <productID>1</productID>
        </product>
        <product>
            <productID>2</productID>
        </product>
    </product>
</root>

疑似xpath クエリは次のとおりです。

//root/products/product

XML に 1 つの製品しか含まれていない場合、1 つのエントリを持つ NodeSet ではなく String を取得します。

<root>
    <products>
        <product>
            <productID>1</productID>
        </product>
    </product>
</root>

更新 2012 年 6 月 12 日: これはまだ Nokogiriのバグだと思います。上記の疑似 xml では状況が再現されませんが、問題を再現するクライアントからの xml の例がいくつかあります。おそらく難読化されたバージョンのxmlを投稿できます。いずれにせよ、 Nokogiriの代わりにXmlSimpleを使用するようにコードを変更しました。

4

2 に答える 2

1

私のために働く:

require 'nokogiri'

xml = "<root><products>
  <product><productID>1</productID></products>
</product></root>"

p Nokogiri.XML(xml).xpath('//root/products/product').class,
  #=> Nokogiri::XML::NodeSet

  Nokogiri::VERSION,
  #=> "1.5.2"

  RUBY_DESCRIPTION
  #=> "ruby 1.9.3p125 (2012-02-16) [x86_64-darwin11.3.0]"

Nokogiri のバージョンが悪い (libxml2 のバージョンが悪い可能性が高い) か、コードが十分に異なっているため、問題を再現する方法を提供する必要があります。

于 2012-05-17T20:49:00.497 に答える
0

私もこの「問題」に遭遇しましたが、少し頭を悩ませた後、何が間違っているのかがわかりました...結果を次のように出力してxpathをデバッグしようとしていました

product_element = Nokogiri.XML(xml).xpath('//root/products/product')
print "product_element is - #{product_element}\n"

要素の文字列バージョンを出力しますが、代わりに使用したときに

product_element = Nokogiri.XML(xml).xpath('//root/products/product')
p product_element

NodeSetとして正しく表示されました。

...これはあなたに起こったことではないかもしれませんが、

于 2012-05-28T22:05:14.987 に答える