0

私は次のXMLファイルを持っています:

<Response Version="X">
  <Status StatusCode = "OK">
  <Internal>
    <SP>
      <URL>SP_url_1</URL>
    </SP>
    <SP>
      <URL>SP_url_2</URL>
    </SP>
  </Internal>
<Response>

すべてのURL要素のテキストを配列で取得したいと思います。

私は以下を実装しました:

...HTTPGETリクエストを実行します...

response_xml = REXML::Document.new(response.body).root
if response_xml.nil? or response_xml.name != 'Response'
  raise ParseError, "Invalid service discovery response!"
end    
status_code  = response_xml.elements['Status'].attribute('StatusCode').value
if status_code == 'OK'
  urls = response_xml.elements.each('//URL') { |u| u }
end
urls

この行に関してresponse_xml.elements.each('//URL') { |u| u }、配列内のすべてのURL要素を取得するためのよりクリーンな方法をお勧めできますか?REXMLメソッドを介して行うより賢明な方法があるかもしれませんが、現時点ではそれを見ることができません。

その他のREXMLまたは一般的なコードの推奨事項は大歓迎です。

4

2 に答える 2

1

XPath でテキスト ノードを取得するには、以下を使用できますtext()

urls = response_xml.elements.each('//URL/text()') { |u| u }
于 2012-12-13T16:28:50.397 に答える
1

私は XML パーサーにNokogiriを使用することを非常に好みます。

require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<Response Version="X">
  <Status StatusCode = "OK">
  <Internal>
    <SP>
      <URL>SP_url_1</URL>
    </SP>
    <SP>
      <URL>SP_url_2</URL>
    </SP>
  </Internal>
<Response>
EOT

if (doc.at('Status')['StatusCode'] == 'OK')
  urls = doc.search('URL').map(&:text)
  # => ["SP_url_1", "SP_url_2"]
end

または:

urls = doc.search('URL').map(&:text) if (doc.at('Status')['StatusCode'] == 'OK')
于 2012-12-13T17:08:27.750 に答える