我尝试使用这两种方式打开xml文件,但只有后一部分在我尝试使用xpath时才起作用。
例如,doc =和标题一样;
doc.xpath('//feed/xyz'), worked only when I open the file using parse method.
我注意到的一件事是,当我使用XML ::打开时的对象是Nokogiri :: XML :: Document,而后者是Nokogiri :: HTML :: Document
有任何意见吗?
答案 0 :(得分:3)
当您调用通用Nokogiri.parse
方法时,Nokogiri使用简单的测试来确定文档是HTML还是XML。我见过它return the wrong results,最好的解决方案是给Nokogiri更多的帮助。
使用parse
或Nokogiri::XML('some xml string')
而不是使用Nokogiri::HTML('some html string')
,而是始终做正确的事情。请参阅Parsing an HTML / XML Document。
根据定义,XML应该验证。 Nokogiri是有用的,并将尝试解析无效的XML(否则它无法解析HTML),但是当遇到错误的XML时,它会使用errors
数组作为包装来标记问题。如果您知道您的文档的来源是可靠的,那么您可以跳过检查,但是您可以轻松地执行类似doc.errors.any?
的操作并做出反应,如果它是真的。
你没有说你试图解析什么类型的XML,但是有XML,然后就是XML。您的Xpath建议您尝试解析Feed。我遇到了很多糟糕的XML提要,我对你遇到错误并不感到惊讶。 Nokogiri试图理解现实世界的条件,但有时这还不够,你必须告诉Nokogiri在解析时更宽容。请参阅options for Nokogiri::XML
以获取标记。
您还会在对所选答案的评论中说明文档在浏览器中正常打开。浏览器不是衡量文档是否有效的好方法,因为浏览器不进行验证,而是尽一切可能呈现某些可读的内容,即使它实际上并不正确。像Nokogiri这样的解析器在解析时需要更加严格,因为没有人脑解释结果。从XML中提取数据的代码不是对错误的宽容,也不应该是错误。
答案 1 :(得分:1)
Nokogiri.parse
解析HTML文档,而Nokogiri::XML
期望有效的XML文档。似乎当XML解析失败时,不会引发错误,而是生成一个空的XML文档。试试puts doc.to_s
,您可能会看到"<?xml version=\"1.0\"?>\n"