Quando provo a leggere un documento XML (file aquila) con un DTD ottengo l'errore:C++ Builder XE2, TXMLDocument 'DTD è proibito'
Project xx raised exception class EDOMParserError with message 'DTD is prohibited'
L'intestazione XML assomiglia a questo:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE eagle SYSTEM "eagle.dtd">
Se rimuovo la seconda linea ...
<!DOCTYPE eagle SYSTEM "eagle.dtd">
... tutto funziona bene.
Dopo un po 'googling sembra che il parser MSXML hanno un'opzione chiamata'prohibitDTD' impostata su true di default (nelle versioni precedenti era falso).
Tuttavia non sembra possibile impostare questa opzione su false dalla classe TXMLDocument. Una soluzione sembra essere una ricompilazione della libreria .pas o creare l'interfaccia da solo con CoCreateInstance().
Tutti gli esempi che ho visto sono in Delphi e ho difficoltà a trascriverli a C++ Builder.
Qualcuno sa come leggere un documento XML DTD con C++ Builder XE2?
Il mio codice di esempio ...
#include <xmldoc.hpp>
_di_IXMLNode XMLObject;
TXMLDocument *XMLDocument = new TXMLDocument(this);
XMLDocument->LoadFromFile(fileName); // <----- Exception EDOMParserError
XMLObject = XMLDocument->DocumentElement;
Grazie ...
Grazie, funziona come un fascino! Strano che questa stessa informazione debba essere così difficile da trovare ... Perché IXMLDocument è meglio di TXMLDocument? Come ho capito, IXMLDocument è una parte di TXMLDocument. –
'TXMLDocument' implementa l'interfaccia' IXMLDocument', quindi ha la stessa funzionalità. Tuttavia, se istanziate dinamicamente 'TXMLDocument' con un proprietario' NULL' (che dovreste fare quando create oggetti XML di breve durata), agisce come un oggetto conteggiato con riferimento. Questo è un comportamento documentato. Non è sicuro assegnare un'istanza dinamica di 'TXMLDocument' a una variabile' TXMLDocument * 'a meno che non sia stato assegnato un Proprietario. Altrimenti, devi invece assegnarlo a una variabile '_di_IXMLDocument' per mantenere correttamente il conteggio dei riferimenti. –
Grazie per la spiegazione. Nel mio caso l'istanza dinamica di TXMLDocument * ha sempre un proprietario e vive attraverso l'intera applicazione. Ho un codice di progetto precedente che funziona con TXMLDocument, quindi lo utilizzo per riutilizzare il vecchio codice. –