C++ Builder XE2,TXMLDocument'DTD被禁止'

Max*_*and 6 xml vcl dtd txmldocument c++builder-xe2

当我尝试使用DTD读取XML文档(eagle文件)时,我收到错误:

Project xx引发异常类EDOMParserError并显示消息'DTD is prohibited'

XML标头如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE eagle SYSTEM "eagle.dtd">
Run Code Online (Sandbox Code Playgroud)

如果我删除第二行...

<!DOCTYPE eagle SYSTEM "eagle.dtd">
Run Code Online (Sandbox Code Playgroud)

......一切正常

在一些谷歌搜索之后,似乎MSXML解析器默认情况下将一个名为'prohibitDTD'的选项设置为true(在早期版本中它是假的).

但是,似乎无法从TXMLDocument类将此选项设置为false.一个解决方案似乎是重新编译.pas库或使用CoCreateInstance()自行创建接口.

我在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;
Run Code Online (Sandbox Code Playgroud)

谢谢...

Rem*_*eau 5

XE2为这个问题引入了一个原生解决方案:有一个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;
Run Code Online (Sandbox Code Playgroud)

另外注意:TXMLDocument像这样动态创建实例通常不是一个好主意.最好使用IXMLDocument界面:

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

MSXML6_ProhibitDTD = false;
_di_IXMLDocument XMLDocument = LoadXMLDocument(fileName);
_di_IXMLNode XMLObject = XMLDocument->DocumentElement;
Run Code Online (Sandbox Code Playgroud)