2012-04-20 7 views
0

У меня есть «parse_error», когда я пытаюсь разобрать файл XML, содержащий конкретный японский иероглиф:Ошибка при разборе файла Xml с RapidXML

退

Если изменить этот кандзи к другому, синтаксический работает хорошо.

Любая идея?

PS: Я парсить файл rapidXML

Вот пример файла XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Exam.xsd"> 
    <Patient> 
    <ESUID>CRodrigueTest-20120423-104410</ESUID> 
    <Lastname>退</Lastname> 
    </Patient> 
</Root> 
+1

Является ли XML UTF-8? Если это UTF-16 или 32, у RapidXml есть некоторые проблемы с теми, которые вы можете прочитать [здесь] (http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1character_types_and_encodings). Убедитесь, что ваш документ закодирован таким образом, что RapidXml поддерживает и пересматривает ваш вопрос, чтобы содержать сведения о кодировке XML-документа. – Cornstalks

+0

Да, xml находится в UTF-8. Я приложу документ xml в понедельник. –

+0

У RapidXML нет проблем с этим XML, если он правильно кодируется в кодировке UTF-8. Покажите свой код, поскольку я ожидаю, что проблема в том, как вы используете Rapidxml. – Roddy

ответ

0

Здесь на самом деле проблема не связана с библиотекой rapidXML. Проблема может быть связана с basic_ifstream.basic_ifstream путем открытия файла defualt только в режиме ansi. Поэтому мы должны установить его в utf-8. Используйте нижеприведенный фрагмент кода:

basic_ifstream<wchar_t> fFileStream(fullxmlfilepath, ios::binary); 

    std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>); 
    fFileStream.imbue(loc); 

    xmlFile = new rapidxml::file<wchar_t>(fFileStream); 
    doc.parse<parse_declaration_node>(xmlFile ->data()); 
+0

Это не так, на нескольких уровнях: OP использует UTF-8, а не UTF-16 или 32. UTF-8 (и, следовательно, все юникодные коды, включая японский, китайский и т. Д.) Полностью поддерживается быстрым XML, поэтому есть нет необходимости использовать другую библиотеку. – Roddy

+0

Да, ты прав Родди. На самом деле я нашел причину этой проблемы. Проблема не в библиотеке rapidxml. В моем случае проблемы были в basic_ifstream. По умолчанию basic_ifstream открывает файл только в режиме ansi. Поэтому нам нужно открыть его в режиме utf-8. –

+0

Добавьте ниже строки кода в существующий поток. std :: locale loc (std :: locale :: classic(), новый std :: codecvt_utf8 ); XMLFileStream.imbue (loc); –

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