Nokogiri XML解析和win1251

时间:2015-03-27 13:04:25

标签: ruby xml nokogiri

我使用Ruby并尝试将Nokogiri用于XML

我有这样的服务器响应

<?xml version="1.0" encoding="windows-1251"?><response><Purpose>\xD0\x9B\xD0\x98\xD0\xA7\xD0\x9D\xD0\xAB\xD0\x95</Purpose><retval>0</retval></response>

和Nokogiri :: XML无法解析它

在rails控制台中:

    a = "<?xml version=\"1.0\" encoding=\"windows-1251\"?><response><Purpose>\xD0\x9B\xD0\x98\xD0\xA7\xD0\x9D\xD0\xAB\xD0\x95</Purpose><retval>0</retval></response>"

    #=> "<?xml version=\"1.0\" encoding=\"windows-1251\"?><response><Purpose>ЛИЧНЫЕ</Purpose><retval>0</retval></response>"

    doc = Nokogiri::XML(a)
    #=> #<Nokogiri::XML::Document:0x6181fc2 name="document">
    doc.errors
    #=> [#<Nokogiri::XML::SyntaxError: input conversion failed due to input error, bytes 0x98 0xD0 0xA7 0xD0>, #<Nokogiri::XML::SyntaxError: switching encoding: encoder error>, #<Nokogiri::XML::SyntaxError: Blank needed here>, #<Nokogiri::XML::SyntaxError: input conversion failed due to input error, bytes 0x98 0xD0 0xA7 0xD0>, #<Nokogiri::XML::SyntaxError: encoder error>, #<Nokogiri::XML::SyntaxError: parsing XML declaration: '?>' expected>, #<Nokogiri::XML::SyntaxError: internal error: Huge input lookup>, #<Nokogiri::XML::SyntaxError: internal error: Huge input lookup>, #<Nokogiri::XML::SyntaxError: internal error: Huge input lookup>, #<Nokogiri::XML::SyntaxError: Start tag expected, '<' not found>] 

似乎, \ xD0 \ x98

的问题

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

该文档完全UTF8 - 编码。您需要为Nokogiri强制UTF-8

a = <<EOT
   <?xml version=\"1.0\" encoding=\"windows-1251\"?>
   <response>
     <Purpose>\xD0\x9B\xD0\x98\xD0\xA7\xD0\x9D\xD0\xAB\xD0\x95</Purpose>
   <retval>0</retval>
   </response>
EOT

#                           ⇓⇓⇓⇓⇓⇓⇓
doc = Nokogiri::XML(a, nil, "UTF-8")
#⇒ #<Nokogiri::XML::Document:0x5c459d2 <SKIPPED>
#           name="Purpose" 
#           children=[#<Nokogiri::XML::Text:0x5c4cc00 "ЛИЧНЫЕ">]>,
#      <SKIPPED> 
#    >]>]>]>

doc.xpath('//response/Purpose').to_s
#⇒ "<Purpose>ЛИЧНЫЕ</Purpose>"

希望它有所帮助。