Newsgroup: it.comp.lang.delphi
Titolo: Validazione Xml con file Xsd

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.

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.
 
 
 
 
 
 
 

 
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.

 fattura elettronica. 
 
Onestamente non ho guardato bene cosa c'è scritto nei link che ti ho suggerito.
 
 
A.

 
Si.
 
Grazie.

 
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.
 
 
 
 


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.