gpt4 book ai didi

vcl - C++ 生成器 XE2,TXMLDocument 'DTD is prohibited'

转载 作者:数据小太阳 更新时间:2023-10-29 01:51:06 25 4
gpt4 key购买 nike

当我尝试读取带有 DTD 的 XML 文档(eagle 文件)时出现错误:

Project xx raised exception class EDOMParserError with message 'DTD is prohibited'

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 为这个问题引入了一个本地解决方案:有一个名为 MSXML6_ProhibitDTD 的全局 bool 变量。在 Xml.Win.msxmldom.hpp 中声明。您可以在将数据加载到 TXMLDocument 之前将其设置为 false:

#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++ 生成器 XE2,TXMLDocument 'DTD is prohibited',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10771022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com