当我尝试使用DTD读取XML文档(Eagle文件)时,出现以下错误:



XML header 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE eagle SYSTEM "eagle.dtd">

如果我删除第二行...
<!DOCTYPE eagle SYSTEM "eagle.dtd">

...一切正常。

经过一番谷歌搜索之后,似乎MSXML解析器有一个名为“prohibitDTD”的选项,默认情况下设置为 true (在早期版本中为false)。

但是,似乎不可能从TXMLDocument类中将此选项设置为false。一种解决方案似乎是.pas库的重新编译,或者由我自己使用CoCreateInstance()创建接口(interface)。

我所见过的所有示例都在Delphi中,并且我有很多技巧可以将它们转换为C++ Builder。

有谁知道如何使用C++ Builder XE2读取DTD XML文档?

我的示例代码...
#include <xmldoc.hpp>

_di_IXMLNode XMLObject;

TXMLDocument *XMLDocument = new TXMLDocument(this);
XMLDocument->LoadFromFile(fileName); // <----- Exception EDOMParserError
XMLObject = XMLDocument->DocumentElement;

谢谢...

最佳答案

XE2针对此问题引入了 native 解决方案:在bool中声明了一个名为 MSXML6_ProhibitDTD 的全局Xml.Win.msxmldom.hpp变量。您可以在将数据加载到false之前将其设置为TXMLDocument:

#include <xmldoc.hpp>
#include <msxmldom.hpp>

MSXML6_ProhibitDTD = false;
TXMLDocument *XMLDocument = new TXMLDocument(this):
XMLDocument->LoadFromFile(fileName);
_di_IXMLNode XMLObject = XMLDocument->DocumentElement;

附带说明:像这样动态创建TXMLDocument实例通常不是一个好主意。最好改用IXMLDocument接口(interface):
#include <xmldoc.hpp>
#include <msxmldom.hpp>

MSXML6_ProhibitDTD = false;
_di_IXMLDocument XMLDocument = LoadXMLDocument(fileName);
_di_IXMLNode XMLObject = XMLDocument->DocumentElement;

关于vcl - C++ Builder XE2,TXMLDocument 'DTD is prohibited',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10771022/

10-11 04:00