Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Validazione Xml con file Xsd

145 views
Skip to first unread message

Luigis

unread,
Jul 30, 2021, 12:51:12 PM7/30/21
to
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

unread,
Aug 13, 2021, 10:07:53 AM8/13/21
to

Luigis

unread,
Aug 13, 2021, 1:08:57 PM8/13/21
to
Il 13/08/2021 16:07, Alberto Salvati ha scritto:
> 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.

> 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

unread,
Aug 16, 2021, 6:32:03 AM8/16/21
to
On Friday, August 13, 2021 at 7:08:57 PM UTC+2, Luigis wrote:
> Il 13/08/2021 16:07, Alberto Salvati ha scritto:
> > 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.



> Non sembra un problema di sicurezza.

Cosa vuol dire "non sembra"?

> Cambiare le impostazioni dei DNS non risolve

Lo hai provato?


> 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

unread,
Aug 17, 2021, 5:13:57 AM8/17/21
to
Il 16/08/2021 12:32, Alberto Salvati ha scritto:
>
> 1) che estensione ha il file XML che devi processare?

.xml

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

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

>> Cambiare le impostazioni dei DNS non risolve
>
> Lo hai provato?
>
Si.

Grazie.

Alberto Salvati

unread,
Aug 17, 2021, 11:31:52 AM8/17/21
to

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

unread,
Aug 17, 2021, 11:52:20 AM8/17/21
to
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.
0 new messages