Discussione:
Validazione Xml con file Xsd
(troppo vecchio per rispondere)
Luigis
2021-07-30 16:51:08 UTC
Permalink
Finora ho validato il file della Fattura Elettronica con questo codice:

Procedure VerificaFE(const AXmlText: string): Boolean;
var
XML, XSDL: Variant;
XmlErr: TStringList;
fnFileName: TFileName;
begin
Result := False;

try
XSDL := CreateOLEObject('MSXML2.XMLSchemaCache.4.0');
XSDL.validateOnLoad := True;
XSDL.add(XmlFETargetNamespace, XmlFEXsdUrl);

XML := CreateOLEObject('MSXML2.DOMDocument.4.0');
XML.validateOnParse := True;
XML.resolveExternals := True;
XML.schemas := XSDL;
Result := XML.loadxml(AXmlText);
except
Raise;
end;
end;

Poiché M$ ha ritirato la libreria MSXML 4.0 che non è disponibile di
default su windows 10 vorrei cambiare utilizzando MSXML 6.0 ma se
modifico il codice come segue:

try
XSDL := CreateOLEObject('MSXML2.XMLSchemaCache.6.0');
XSDL.validateOnLoad := True;
XSDL.add(XmlFETargetNamespace, XmlFEXsdUrl);

Qui ottengo l'eccezione "La DTD non è consentita".

Non riesco ad andare avanti.

Qualcuno saprebbe indirizzarmi su cosa controllare/modificare?

Grazie.
Alberto Salvati
2021-08-13 14:07:52 UTC
Permalink
Questi li hai già visti..?

https://stackoverflow.com/questions/5069130/why-do-i-get-the-error-dtd-is-not-allowed-on-this-document

https://docs.microsoft.com/en-us/answers/questions/417418/for-security-reasons-dtd-is-prohibited-in-this-xml.html


A.
Luigis
2021-08-13 17:08:54 UTC
Permalink
Post by Alberto Salvati
Questi li hai già visti..?
https://stackoverflow.com/questions/5069130/why-do-i-get-the-error-dtd-is-not-allowed-on-this-document
Non trovo gli oggetti XmlTextReader, XmlReaderSettings e xmlresolver nel
codice sorgente di Delphi 2010.
Post by Alberto Salvati
https://docs.microsoft.com/en-us/answers/questions/417418/for-security-reasons-dtd-is-prohibited-in-this-xml.html
Non sembra un problema di sicurezza.
Il messaggio di errore completo è:
"Durante il caricamento dello schema
"http://www.w3.org/tr/2002/rec-xmldsig-core-20020212/xmldsig-core.schema.xsd"
si è verificato il seguente errore: La DTD non è consentita"

Cambiare le impostazioni dei DNS non risolve ed in ogni caso non posso
cambiare i DNS dei PC dove viene eseguita l'applicazione che genera la
fattura elettronica.

Grazie.
Alberto Salvati
2021-08-16 10:32:01 UTC
Permalink
Post by Luigis
Post by Alberto Salvati
Questi li hai già visti..?
https://stackoverflow.com/questions/5069130/why-do-i-get-the-error-dtd-is-not-allowed-on-this-document
Non trovo gli oggetti XmlTextReader, XmlReaderSettings e xmlresolver nel
codice sorgente di Delphi 2010.
Non avevi specificato la versione di delphi....
A parte ciò:

1) che estensione ha il file XML che devi processare?
2) prova a eseguire la stessa operazione da qualcosa che non sia il tuo programma delphi e vedi cosa succede.
Post by Luigis
Non sembra un problema di sicurezza.
Cosa vuol dire "non sembra"?
Post by Luigis
Cambiare le impostazioni dei DNS non risolve
Lo hai provato?
Post by Luigis
ed in ogni caso non posso
cambiare i DNS dei PC dove viene eseguita l'applicazione che genera la
fattura elettronica.
Onestamente non ho guardato bene cosa c'è scritto nei link che ti ho suggerito.


A.
Luigis
2021-08-17 09:13:57 UTC
Permalink
Post by Alberto Salvati
1) che estensione ha il file XML che devi processare?
.xml
Post by Alberto Salvati
2) prova a eseguire la stessa operazione da qualcosa che non sia il tuo programma delphi e vedi cosa succede.
In altri validatori il file passa il controllo, così come passa se
utilizzo MSXML 4.0 invece che 6.0.
Post by Alberto Salvati
Post by Luigis
Non sembra un problema di sicurezza.
Cosa vuol dire "non sembra"?
Che nel link che mi hai dato il messaggio di errore fa specifico
riferimento alla "sicurezza": "For *security* reasons DTD is prohibited
in this XML document" mentre nel mio caso dice semplicemente: "La DTD
non è consentita".
Post by Alberto Salvati
Post by Luigis
Cambiare le impostazioni dei DNS non risolve
Lo hai provato?
Si.

Grazie.
Alberto Salvati
2021-08-17 15:31:51 UTC
Permalink
Ho trovato questo:

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms762632(v=vs.85)

si parla di una property "ProhibitDTD" che nelle versioni precedenti di msxml era di default a FALSE mentre nella 6.0 è TRUE....

A.
Luigis
2021-08-17 15:52:24 UTC
Permalink
Post by Alberto Salvati
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms762632(v=vs.85)
si parla di una property "ProhibitDTD" che nelle versioni precedenti di msxml era di default a FALSE mentre nella 6.0 è TRUE....
Già letto e credo di aver trovato la soluzione modificando una procedura
presente in rete come segue in modo da poter impostare la property
"ProhibitDTD" funzionante. In pratica la property *deve* essere
impostata *prima* del caricamento del file .xml:

procedure ValidazioneFE2;
var
SchemaDoc, XmlDoc: IXMLDOMDocument2;
SchemaCache: IXMLDOMSchemaCollection;
Error: IXMLDOMParseError;
begin
//--------------- Load schema schema document ------------------------
// -------- Va impostato *prima* di caricare i dati --------------
SchemaDoc := CoDOMDocument60.Create;
SchemaDoc.async := False;
SchemaDoc.resolveExternals := True;
SchemaDoc.setProperty('ProhibitDTD', False);
SchemaDoc.load ( XmlFEXsdUrl );

//--------------- register schema cache- -----------------------
SchemaCache := CoXMLSchemaCache60.Create;
SchemaCache.add ( XmlFETargetNamespace, schemadoc);

//--------------- load data-- ----------------------
XmlDoc := CoDOMDocument60.Create;
XmlDoc.async := False;
XmlDoc.resolveExternals := True;
XmlDoc.load ( 'D:\FEdiProva.xml' );

//-------- allocate the schema cache to the XML document ----------
XmlDoc.schemas := schemacache;

//--------------- Verification and Report --------- ---------------
Error := xmldoc.validate;
if Error.errorCode <> S_OK then
ShowMessage(Error.reason)
else
ShowMessage( 'Verification succeeded ' );
end;

Così sembra funzionare, la sto testando.

Grazie.

Continua a leggere su narkive:
Loading...