【问题标题】:Problem reading XML with Nokogiri使用 Nokogiri 读取 XML 时出现问题
【发布时间】:2011-08-18 17:40:05
【问题描述】:

我的 Ruby 脚本应该从 URL 读取 XML 文档并检查它的格式是否正确,并返回任何错误。我有一个包含以下文本的示例错误 XML 文档(来自 Nokogiri tutorial:

<?xml version="1.0"?>
  <root>
    <open>foo
      <closed>bar</closed>
  </root>

我的测试脚本如下(url指的是上面托管在我个人服务器上的xml文件):

require 'nokogiri'

document = Nokogiri::XML(url) 

puts document
puts document.errors

输出是:

<?xml version="1.0"?>
Start tag expected, '<' not found

为什么只捕获 XML 文件的第一行?即使是已知良好的 XML 文件,它也会这样做。

【问题讨论】:

    标签: ruby xml nokogiri


    【解决方案1】:

    它试图解析 url,而不是它的内容。请注意Nokogiri::XML 的第一个参数必须是包含文档的字符串或IO 对象,因为它只是Nokogiri::XML::Document.parse 的快捷方式,如here 所述。

    编辑:用于从 uri 读取

    require 'open-uri'
    open(uri).read
    

    【讨论】:

    • 好的,我现在明白了。当我只有 URL 时,如何解析内容?
    • 更新了!用'open-uri'很容易打开一个uri。
    • 我最终使用了普罗维登斯的行 doc = Nokogiri::XML(open(url)),但感谢您为我指明了正确的方向!
    【解决方案2】:

    我不太确定您使用什么代码来实际输出 XML 的内容。我只看到错误打印代码。但是,我已经发布了一些示例代码,以便在下面使用 Nokogiri 有效地通过 XML:

    <item>
      Something
    </item> 
    <item>
      Else
    </item>
    
    doc = Nokogiri::XML(open(url))
    set = doc.xpath('//item')
    set.each {|item| puts item.to_s}
      #=> Something
      #=> Else
    

    总的来说,教程here 应该对你有所帮助。

    【讨论】:

    • 我认为我的问题似乎与将 XML 文件读入文档的行有关。我还没有在网上找到一个例子:doc = Nokogiri::XML(url) 有效。每个示例看起来像:@doc = Nokogiri::XML(File.open("shows.xml")).
    • 看看我的回答,如果有不清楚的地方请告诉我。
    • @providence,是的,我试过要求这样做。 Serabe 明确表示我的语法不正确,但我还没有弄清楚如何让它解析提供的 url 的内容。
    • 抱歉,该行应该是 Nokogiri::XML(open(url))。我已经纠正了我的例子。你可以在这里看到它的上下文:github.com/jprovidence/Arrogance/blob/rails/lib/arrogance/…
    【解决方案3】:

    如果您已经从 Nokogiri xml 获取 xml,请确保在将其传递给 XML 函数之前使用“.to_s”。

    例如, xml = Nokogiri::XML(existing_nokogiri_xml_doc.to_s)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多