1

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 をパーサーとして使用する必要があります。任意の提案をいただければ幸いです。

4

0 に答える 0