當我嘗試讀取與DTD的XML文檔(鷹文件),我得到的錯誤:C++ Builder的XE2,TXMLDocument的 'DTD禁止'
Project xx raised exception class EDOMParserError with message 'DTD is prohibited'
XML標頭看起來是這樣的:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE eagle SYSTEM "eagle.dtd">
如果我刪除第二行...
<!DOCTYPE eagle SYSTEM "eagle.dtd">
...一切工作正常。
經過一些Google搜索之後,似乎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;
謝謝...
謝謝你的作品就像一個魅力!奇怪的是,這條信息應該很難找到......爲什麼IXMLDocument比TXMLDocument更好?據我所知,IXMLDocument是TXMLDocument的一部分。 –
'TXMLDocument'實現了'IXMLDocument'接口,所以它具有相同的功能。但是,如果您使用「NULL」所有者動態實例化「TXMLDocument」(在創建短暫的XML對象時應該這樣做),它將充當引用計數對象。這是記錄的行爲。除非指定了Owner,否則將「TXMLDocument」的動態實例分配給「TXMLDocument」變量是不安全的。否則,您必須將其分配給'_di_IXMLDocument'變量,而不是正確維護引用計數。 –
謝謝你的解釋。在我的情況下,TXMLDocument *的動態實例總是擁有一個擁有者並且貫穿整個應用程序。我有早期的項目代碼與TXMLDocument一起工作,所以我使用它來方便重用舊代碼。 –