首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby rexml:干净地解析xml文件

ruby rexml:干净地解析xml文件
EN

Stack Overflow用户
提问于 2012-12-13 23:48:17
回答 2查看 719关注 0票数 0

我有以下XML文件:

代码语言:javascript
复制
<Response Version="X">
  <Status StatusCode = "OK">
  <Internal>
    <SP>
      <URL>SP_url_1</URL>
    </SP>
    <SP>
      <URL>SP_url_2</URL>
    </SP>
  </Internal>
<Response>

我希望获得一个数组中的所有URL元素的文本。

我实现了以下内容:

...perform一个HTTP GET请求...

代码语言:javascript
复制
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或通用代码建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-14 01:08:28

我非常喜欢在我的XML解析器中使用Nokogiri

代码语言:javascript
复制
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

或者:

代码语言:javascript
复制
urls = doc.search('URL').map(&:text) if (doc.at('Status')['StatusCode'] == 'OK')
票数 1
EN

Stack Overflow用户

发布于 2012-12-14 00:28:50

要使用XPath获取文本节点,可以使用text()

代码语言:javascript
复制
urls = response_xml.elements.each('//URL/text()') { |u| u }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13863431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档