我目前正在开发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,wordpad或其他任何内容打开文件(上面错误的文件的来源),语法是正确的,并且根本没有错误。一切都在这里,没有什么遗漏。
我不怀疑我的读/写代码是错误的,因为当我打开/读取/写入未经修改的XML文件时,一切似乎都按计划运行。
现在,如果有人知道为什么我会收到这个错误,我将非常感激。 TinyXML支持和文档有些限制,无法解决我的问题。 我一直在寻找答案。
答案 0 :(得分:2)
好吧,我没有回复,但我通过解决另一个问题解决了这个问题。我写入我的XML的数据使用了我出于某种原因使用的编码表。通过让TinyXML管理自己的编码,这个问题本身就消失了。
这是一件好事,没有明显的原因(即使通过十六进制比较,两个ascii字符在两个编码表之间完全相同,所以我无法意识到导致问题的原因。)
答案 1 :(得分:1)
我遇到了同样的问题。
我正在使用UTF-8编码在Notepad ++中编辑我的XML文件,同时在XML中指定该编码。仍然行不通。
所以我尝试将我的XML保存为没有BOM的UTF-8,并且工作正常;)