2015-03-27 3 views
1

Я использую Ruby, и пытается использовать Nokogiri для XMLNokogiri XML синтаксический анализ и win1251

У меня есть ответ такого сервера

<?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 не может разобрать его

В рельсах консоли:

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

как я могу решить эту проблему?

+0

Можете ли вы попробовать «Nokogiri :: XML (a, nil,« windows-1251 »)'? –

+0

да я могу, но в этом случае я потеряю полное значение Konstantin

+0

Разве это не верно для последовательности UTF-8 'ЛИЧНЫЕ'? Документ XML сообщает вам неправильную кодировку. –

ответ

1

Документ отлично UTF8 -кодированный. Вы должны заставить UTF-8для Nokogiri:

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>" 

Надеется, что это помогает.

Смежные вопросы