使用Nokogiri在XML标记内的无效铃声字符

时间:2015-10-29 20:36:13

标签: ruby nokogiri

我正在使用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中的无效字符?

1 个答案:

答案 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>

您可以在解析之前使用trdelete删除不需要的字符。不要在搜索字符串中使用^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>"