我正在使用Nokogiri::XML::SAX::Document
来解析通过购物而填充的XML文件。
其中一些项目中有一个带有铃声字符的段落,没有CDATA块部分:
<description>Amazing product that will blow your mind. ^G Caution: may cause skin irritation and death.</description>
* ^G
是此字符在VIM中的显示方式。
解析该元素失败,然后我收到以下错误:
XML document contains errors, check this: PCDATA invalid Char value 7.
有没有办法阅读上面显示的元素,忽略Nokogiri中的无效字符?
答案 0 :(得分:1)
它不是无效的角色; :
在文本节点中完全有效。问题必然在于其他地方,可能是由于文档中的XML无效,因为它解析了文档时混淆了libXML。
require 'nokogiri'
doc = Nokogiri::XML::DocumentFragment.parse('<description>Amazing product that will blow your mind. Caution: may cause skin irritation and death.</description>')
doc.to_xml # => "<description>Amazing product that will blow your mind. Caution: may cause skin irritation and death.</description>"
doc.errors # => []
doc.at('description').text # => "Amazing product that will blow your mind. Caution: may cause skin irritation and death."
要查看您的文档是否有效,请使用errors
方法让Nokogiri返回一系列错误。在上面的代码中,它返回一个空数组,这意味着解析的内容没有任何问题。
......我发现哪个角色确实导致了这个问题......
<description>Amazing product that will blow your mind. ^G Caution: may cause skin irritation and death.</description>
您可以在解析之前使用tr
或delete
删除不需要的字符。不要在搜索字符串中使用^G
,而是使用\a
,因为它是相同的值,只是更容易处理:
>> "^G".ord#=> 7
>> "\a".ord #=> 7
所以,你可以这样做:
require 'nokogiri'
xml = "<description>Amazing product that will blow your mind. \a Caution: may cause skin irritation and death.</description>"
doc = Nokogiri::XML::DocumentFragment.parse(xml.delete("\a"))
doc.to_xml # => "<description>Amazing product that will blow your mind. Caution: may cause skin irritation and death.</description>"