3

我目前正在 Visual Studio 2003 上开发 C++ MFC 项目。该项目的目的是能够获取包含语言数据的 XML 文件,将其转换为简单的 CSV 文件并返回 XML。为此,我使用了 TinyXML 库,它既简单又足以满足我的需要。

问题是,一旦我尝试将我的 .CSV 文件转换为 XML,则无法使用 TinyXML 再次打开创建的 XML。从我现在看到的情况来看,它似乎无法打开它刚刚创建的文件。

经过一些测试,我能够让 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、写字板或其他任何方式打开文件(上述错误文件的源代码),则语法是正确的,并且完全没有错误。一切都在这里,什么都没有。

我不怀疑我的读/写代码有问题,因为当我打开/读/写一个未触及的 XML 文件时,一切似乎都按计划进行。

现在,如果有人对我为什么会收到此错误有任何想法,我将不胜感激。TinyXML 支持和文档有些有限,无法解决我的问题。我一直在等待答案。

4

2 回答 2

2

好吧,我没有回复,但我通过解决另一个问题解决了这个错误。无论出于何种原因,我写入 XML 的数据都使用了我正在使用的编码表。通过让 TinyXML 管理自己的编码,这个问题自行消失了。

这是一件好事,没有明显的原因(即使通过十六进制比较,两个编码表之间的两个 ascii 字符完全相同,所以我不知道是什么导致了问题)。

于 2010-02-23T21:27:00.523 回答
1

我遇到了同样的问题。

我在 Notepad++ 中以 UTF-8 编码编辑我的 XML 文件,同时也在 XML 中指定该编码。还是不行。

所以我尝试将我的 XML 保存为没有 BOM 的 UTF-8,它工作正常;)

于 2012-04-28T17:05:49.433 回答