TinyXML не может прочитать свой собственный файл - PullRequest
3 голосов
/ 19 февраля 2010

В настоящее время я работаю над проектом CFC MFC для Visual Studio 2003. Цель этого проекта - получить XML-файл, содержащий языковые данные, преобразовать его в простой CSV-файл и обратно в XML. Для этого я использую библиотеку TinyXML, которая проста и достаточно хороша для моих нужд.

Проблема в том, что, как только я пытаюсь преобразовать мой файл .CSV в XML, созданный XML не может быть снова открыт с помощью TinyXML. Из того, что я вижу сейчас, кажется, что он не может открыть только что созданный файл.

После некоторого тестирования я смог заставить TinyXML сообщить мне свою ошибку: «Ошибка № 9: Невозможно прочитать конечный тег». Если я пропущу ошибку, файл будет доступен для чтения до того момента, когда дерево DOM отступит вправо без всякой причины, а затем, чуть позже, файл окажется пустым от какого-либо элемента.

Это ошибочный файл, прочитанный TinyXML после его создания.

<app>
−
<global>
    <langidglobal1 lang="fr">GLOBAL1</langidglobal1>
    <langidglobal1 lang="en">GLOBAL1</langidglobal1>
    <langidglobal1 lang="ru"/>
    <langidglobal1 lang="de"/>
</global>
−
<mainmenu>
    <system lang="fr">Syst�me</system>
    <system lang="en">System</system>
    <system lang="ru"/>
    <system lang="de"/>
    <motor lang="fr">Moteurs</motor>
    <motor lang="en">Motors</motor>
    <motor lang="ru"/>
    <motor lang="de"/>
    <param lang="fr">Param�tres</param>
    <param lang="en">Parameters</param>
    <param lang="ru"/>
    <param lang="de"/>
    <diag lang="fr">Diagnostique</diag>
    <diag lang="en">Diagnostic</diag>
    <diag lang="ru"/>
    <diag lang="de"/>
    <rod lang="fr">Tiges</rod>
    <rod lang="en">Rods</rod>
    <rod lang="ru"/>
    <rod lang="de"/>
    <aide lang="fr">Aide</aide>
    <aide lang="en">Help</aide>
    <aide lang="ru"/>
    <aide lang="de"/>
    <exit lang="fr">Quitter</exit>
    <exit lang="en">Exit</exit>
    <exit lang="ru"/>
    <exit lang="de"/>
    <runningtools lang="fr">Outils</runningtools>
    <runningtools lang="en">Running Tools</runningtools>
    <runningtools lang="ru"/>
    <runningtools lang="de"/>
    <manualpatterns lang="fr">Patron Manuel</manualpatterns>
    <manualpatterns lang="en">Manual Patterns</manualpatterns>
    <manualpatterns lang="ru"/>
    <manualpatterns lang="de"/>
    <alarm lang="fr">Alarmes Actives</alarm>
    <alarm lang="en">Active Alarms</alarm>
    <alarm lang="ru"/>
    <alarm lang="de"/>
    <patternno lang="fr"># Patron</patternno>
    <patternno lang="en">Pattern #</patternno>
    <patternno lang="ru"/>
    <patternno lang="de"/>
    <lastlogs lang="fr">Derni�res Billes</lastlogs>
    <lastlogs lang="en">Last Logs</lastlogs>
    <lastlogs lang="ru"/>
    <lastlogs lang="de"/>
    <maintenancemode lang="fr">Entretien</maintenancemode>
    <maintenancemode lang="en">Maintenance</maintenancemode>
    <maintenancemode lang="ru"/>
    <maintenancemode lang="de"/>
−
    <toolcustom1 lang="fr"> <!-- Random indentation starts here -->
    Force Entr�e

        <toolcustom1 lang="en">Force Input</toolcustom1>
        <toolcustom1 lang="ru"/>
        <toolcustom1 lang="de"/>
        <toolcustom2 lang="fr">Force Sortie</toolcustom2>
        <toolcustom2 lang="en">Force Output</toolcustom2>
        <toolcustom2 lang="ru"/>
        <toolcustom2 lang="de"/>
        <jogaxis lang="fr">Jog Axes</jogaxis>
        <jogaxis lang="en">Jog Axis</jogaxis>
        <jogaxis lang="ru"/>
        <jogaxis lang="de"/>   <!-- And finishes here -->
    </toolcustom1>
    <toolcustom1 lang="en">Force Input</toolcustom1>
    <toolcustom1 lang="ru"/>
    <toolcustom1 lang="de"/>
</mainmenu>
<menuparam/> <!-- File is empty from here. There should be elements like above. -->
<menudiag/>
<menurod/>
<menuaide/>
<button/>
<progrid/>
<aboutbox/>
<dlgexit/>
<doc/>
<!-- ...like this until... -->
</app>

Если я получаю указатель на первый элемент и просматриваю во время отладки, это именно то, что TinyXML читает с помощью команды «LoadFile ()».

Также обратите внимание, что если я открою файл (источник ошибочного файла выше) с помощью Firefox, или wordpad, или чего-либо еще, синтаксис будет правильным, и ошибки вообще не будет. Все здесь, ничего не пропало.

Я не подозреваю, что мой код для чтения / записи неверен, поскольку при открытии / чтении / записи нетронутого XML-файла все кажется работающим, как планировалось.

Теперь, если у кого-нибудь возникнет идея, почему я получаю эту ошибку, я был бы очень признателен. Поддержка и документация TinyXML несколько ограничены и не решают мою проблему. Жду ответов.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

Ну, у меня нет ответов, но я решил эту ошибку, решив другую. Данные, которые я записывал в свой XML, использовали таблицы кодирования, которые я использовал по любой причине. Позволяя TinyXML управлять своими собственными кодировками, эта проблема исчезла сама по себе.

Это хорошо, очевидной причины не было (даже при сравнении в шестнадцатеричном формате два символа ascii абсолютно совпадают между двумя таблицами кодирования, поэтому я не мог понять, что вызвало проблему).

1 голос
/ 28 апреля 2012

Я столкнулся с той же проблемой.

Я редактировал свой XML-файл в Notepad ++ в кодировке UTF-8, одновременно указав эту кодировку в XML. Все равно не сработает.

Итак, я попытался сохранить свой XML как UTF-8 без спецификации, и он работал нормально;)

...