REXML 3.1.7.3 と ruby 1.9.3 で utf-16 xml ファイルをロードできるかどうか疑問に思っています。
以下は、BOM なしのファイル u16.xml 内の xml データです。
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfCatalogItem>
<CatalogItem>
<ID>bbe9b897-5d3b-4340-914b-fce8d6022bd9</ID>
<Name>EmployeeReport</Name>
</CatalogItem>
</ArrayOfCatalogItem>
次のコードを使用してロードします。
require "rexml/document"
file = File.new( "u16.xml" )
begin
doc = REXML::Document.new(file)
puts "doc = #{doc.to_s}"
rescue => err
puts "err = #{err.message}"
end
そして、テストの出力:
err = #<REXML::ParseException: malformed XML: missing tag start
Line: 8
Position: 420
Last 80 unconsumed characters:
<?xml version="1.0" encoding="utf-16"?> <>
/Users/lucy/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:367:in `pull_event'
/Users/lucy/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:183:in `pull'
/Users/lucy/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/rexml/parsers/treeparser.rb:22:in `parse'
/Users/lucy/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/rexml/document.rb:245:in `build'
/Users/lucy/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/rexml/document.rb:43:in `initialize'
xml-test.rb:6:in `new'
xml-test.rb:6:in `<main>'
...
malformed XML: missing tag start
Line: 8
Position: 420
Last 80 unconsumed characters:
<?xml version="1.0" encoding="utf-16"?> <
Line: 8
Position: 420
Last 80 unconsumed characters:
<?xml version="1.0" encoding="utf-16"?> <
xml ファイルを utf-8 エンコーディングに変更するだけで、同じコードで正常にロードされます。
doc = <?xml version='1.0' encoding='UTF-8'?>
<ArrayOfCatalogItem>
<CatalogItem>
<ID>bbe9b897-5d3b-4340-914b-fce8d6022bd9</ID>
<Name>EmployeeReport</Name>
</CatalogItem>
</ArrayOfCatalogItem>
REXMLでutf-8 xmlファイルをロードすることは可能ですか? この場合、REXML をパーサーとして使用する必要があります。任意の提案をいただければ幸いです。