Nokogiri XML 解析和 win1251
Nokogiri XML parse and win1251
我正在使用 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
的问题
我该如何解决这个问题?
文档完美 UTF8
编码。你需要强制UTF-8
for 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>"
希望对您有所帮助。
我正在使用 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
的问题我该如何解决这个问题?
文档完美 UTF8
编码。你需要强制UTF-8
for 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>"
希望对您有所帮助。