Domanda

Ho usato la procedura guidata per l'associazione dei dati di Delphi 2006 per creare un'interfaccia per un file di configurazione XML. In seguito mi sono reso conto che alcune parti ripetute dell'XML possono essere separate dal file principale e referenziate dove necessario. L'XML risultante è simile al seguente:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module [
<!ENTITY Schema65 SYSTEM "schemas/65.xml">
]>
<module>
  <schema>&Schema65;</schema>
</module>

Se apro questo file utilizzando Internet Explorer, il contenuto del segnaposto " & amp; Schema65; " viene correttamente sostituito con il contenuto del file esterno. Il parser Delphi tuttavia non sembra riconoscere questa funzionalità e non sostituisce il testo. Qualche idea su come risolvere questo problema?

È stato utile?

Soluzione

Internet Explorer sta sicuramente usando la libreria MSXML. Impostare la proprietà TXmlDocument.DomVendor su MSXML_DOM (presente nell'unità msxmldom ) e si dovrebbe ottenere lo stesso comportamento. Puoi anche modificare la variabile globale DefaultDOMVendor in SMSXML per fare in modo che tutti i nuovi oggetti TXmlDocument utilizzino quel fornitore.

Altri suggerimenti

Hai già provato OmniXML ? Lo uso da anni e ha sempre risolto i miei problemi relativi ai file XML. In caso contrario, ti consiglio di provarlo: è semplice da usare, leggero e gratuito.

Internet Explorer utilizza XmlResolver , La proprietà XmlResolver di XmlDocument viene utilizzata dalla classe XmlDocument per individuare risorse che non sono in linea nei dati XML, come definizioni di tipi di documento esterno (DTD), entità e schemi. Questi elementi possono trovarsi su una rete o su un'unità locale e sono identificabili da un URI (Uniform Resource Identifier). Ciò consente a XmlDocument di risolvere i nodi EntityReference presenti nel documento e convalidare il documento in base al DTD o allo schema esterno.

dovresti usare una libreria delphi che implementa un resolver e un parser su risorse esterne.

Open XML implementa un resolver usando TStandardResourceResolver

Ciao.

Quanto segue ha risolto il problema per me. Sembra che il parser predefinito Delphi (MSXML) in realtà includa riferimenti a entità esterne ma in qualche modo strano. Per questo esempio

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module [
<!ENTITY Schema65 SYSTEM "schemas/65.xml">
]>
<module>
  <schema>&Schema65;</schema>
</module>

Supponevo che creando un TXMLDocument e che il file esterno contenesse un semplice testo potessi ottenere il contenuto del file in questo modo:

MyXML := TXMLDOcument.Create(myfile.xml);
ExternalText := MyXML.documentElement.ChildNodes['schema'].Text;

Funziona effettivamente se il riferimento all'entità viene sostituito con il testo semplice. Tuttavia, in caso di utilizzo dell'entità esterna, Delphi creerà un nuovo figlio di tipo "ntEntityRef" all'interno dello "schema" nodo. Questo nodo avrà anche un figlio che alla fine contiene il semplice testo che mi aspettavo. È possibile accedere al testo in questo modo:

MyXML.documentElement.ChildNodes['schema'].FirstChild.FirstChild.Text;

Nel caso in cui il file di entità esterno contenga una struttura di nodo, i nodi corrispondenti verranno creati all'interno del nodo di riferimento dell'entità. Assicurarsi che TXMLDocument.ParseOptions sia impostato almeno su [poResolveExternals] affinché ciò accada. Questo approccio rende anche relativamente facile adattare il codice generato dalla procedura guidata di associazione dati XML per lavorare con entità esterne.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top