当我尝试使用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/