неправильный XML-код: отсутствует начало тега - PullRequest
1 голос
/ 07 января 2011

У меня очень странная проблема: я запускаю один и тот же код для двух XML-файлов, второй из которых является копией первого (я скопировал содержимое, возможно, это проблема). Код использует REXML для разбора XML-файла, с первым файлом все хорошо, на втором у меня появляется эта ошибка: Ошибка: неправильно сформированный XML: отсутствует начало тега Линия: 2 Позиция: 102 Последние 80 неиспользованных персонажей:

<t>dede</t> 

Содержимое XML-файла:

<?xml version="1.0" standalone="yes"?>
<t>dede</t>

Есть идеи?

Большое спасибо

Ответы [ 3 ]

1 голос
/ 11 марта 2011

Это из-за кодировки файла.У меня та же проблема, и я обнаружил, что файл был закодирован в UCS-2.Либо UTF-8 или ANSI работает, но UCS-2 не кажется.Для этого формата, вероятно, сначала понадобятся специализированные парсеры.Я только что преобразовал XML-файл в Notepad ++, чтобы проверить различные кодировки.

1 голос
/ 07 января 2011

У меня нет такой проблемы с использованием этого кода:

require 'rexml/document'
doc = REXML::Document.new <<ENDXML
  <?xml version="1.0" standalone="yes"?>
  <t>dede</t>
ENDXML

doc.each_element('//t'){ |e| puts e }
#=> <t>dede</t>

Какую версию Ruby вы используете и как выглядит ваш код?

Редактировать : Основываясь на новой информации, которую вы используете анализатор потока, вот еще один фрагмент кода, который также работает для меня, используя Ruby 1.8.7:

class Listener
  def method_missing( name, *args ); puts "I don't support '#{name}'"; end
  def tag_start( name, attrs ); puts "<#{name} #{attrs.inspect}>"; end
  def text( str ); p str; end
  def tag_end( name ); puts "</#{name}>"; end
end

require 'stringio'
xml = StringIO.new <<ENDXML
    <?xml version="1.0" standalone="yes"?>
    <t>dede</t>
ENDXML

require 'rexml/document'
doc = REXML::Document.parse_stream( xml, Listener.new )
#=> "\t"
#=> I don't support 'xmldecl'
#=> "\n\t"
#=> <t {}>
#=> "dede"
#=> </t>
#=> "\n"
0 голосов
/ 27 июля 2012

REXML кажется слишком нетерпеливым, чтобы вызвать исключение ParseException.Кодирование определенно является основным виновником.Проверьте кодировку ваших файлов.

...