Frage

Ich habe Delphi 2006 Daten Assistenten Binden eine Schnittstelle für eine XML-Konfigurationsdatei zu erstellen. Später wurde mir klar, dass einige wiederholt Teile des XML können von der Hauptdatei getrennt werden und bei Bedarf verwiesen. Das resultierende XML sieht ungefähr wie folgt aus:

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

Wenn ich diese Datei öffne mit dem Internet Explorer den Inhalt des Platzhalter „& Schema65;“ richtig mit dem Inhalt der externen Datei ersetzt. Der Delphi-Parser scheint jedoch nicht um diese Funktion zu erkennen und nicht den Text ersetzen. Jede Idee, wie dieses Problem zu lösen?

War es hilfreich?

Lösung

Internet Explorer wird mit Sicherheit der MSXML-Bibliothek. Stellen Sie die TXmlDocument.DomVendor Eigenschaft auf MSXML_DOM (in der msxmldom Einheit gefunden), und Sie sollten das gleiche Verhalten bekommen. Sie können auch die DefaultDOMVendor globale Variable ändern, um SMSXML alle neuen TXmlDocument Objekte dieses Anbieters verwenden zu machen.

Andere Tipps

Haben Sie schon versucht, OmniXML ? Ich habe es seit Jahren verwendet und es immer meine Probleme in Bezug auf XML-Dateien behoben. Wenn Sie nicht haben, würde ich empfehlen Ihnen, es zu versuchen. Es ist einfach zu bedienen, leicht und frei

Internet Explorer benutzen XmlResolver , die XmlResolver Eigenschaft des XmlDocument wird von der XmlDocument-Klasse verwendete Ressourcen zu lokalisieren, die in den XML-Daten, wie zum Beispiel externe Dokumenttypdefinitionen (DTDs), Organisationen und Schemata Inline nicht. Diese Elemente können in einem Netzwerk oder auf einem lokalen Laufwerk befinden, und sind an einem Uniform Resource Identifier (URI). Dies ermöglicht die XmlDocument EntityReference Knoten zu lösen, die in dem Dokument enthalten sind, und bestätigen Sie das Dokument nach der externen DTD oder Schema.

sollten Sie eine delphi Bibliothek verwenden, die einen Resolver und Parser auf externe Ressourcen implementiert.

Open XML implementiert einen Resolver mit TStandardResourceResolver

Bye.

In der folgenden löste das Problem für mich. Es scheint, dass Delphi Standard-Parser (MSXML) tatsächlich externe Entitätsverweise aber in einer irgendwie seltsame Weise enthält. Für dieses Beispiel

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

ich davon aus, dass eine TXMLDocument zu schaffen und dass die externe Datei einen einfachen Text enthält ich den Inhalt der Datei wie folgt erhalten könnte:

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

Das funktioniert tatsächlich, wenn die Entity-Referenz mit dem einfachen Text ersetzt wird. Jedoch im Falle der externen Einheit mit Delphi ein neues Kind vom Typ „ntEntityRef“ innerhalb des „Schema“ Knoten erstellen. Dieser Knoten wird auch ein Kind haben, die schließlich den einfachen Text enthält ich erwartet hatte. Der Text kann greift so aussehen:

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

Falls die externe Entität Datei eine Knotenstruktur enthält, werden die entsprechenden Knoten innerhalb des Entität-Referenzknoten angelegt werden. Stellen Sie sicher, TXMLDocument.ParseOptions eingestellt sind zumindest bis zu [poResolveExternals] das geschehen kann. Dieser Ansatz macht es auch relativ einfach, den Code durch die XML-Daten generiert anzupassen Binding Wizard mit externen Einheiten zu arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top