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)
谢谢...
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)
| 归档时间: |
|
| 查看次数: |
3067 次 |
| 最近记录: |