Question

J'ai utilisé l'assistant de liaison de données Delphi 2006 pour créer une interface pour un fichier de configuration XML. Plus tard, j'ai réalisé que certaines parties répétées du XML peuvent être séparées du fichier principal et référencées si nécessaire. Le résultat XML ressemble à ceci:

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

Si j'ouvre ce fichier à l'aide d'Internet Explorer, le contenu de l'espace réservé " & amp; Schema65; " est correctement remplacé par le contenu du fichier externe. L'analyseur Delphi ne semble toutefois pas reconnaître cette fonctionnalité et ne remplace pas le texte. Avez-vous une idée de la façon de résoudre ce problème?

Était-ce utile?

La solution

Internet Explorer utilise sûrement la bibliothèque MSXML. Définissez la propriété TXmlDocument.DomVendor sur MSXML_DOM (figurant dans l'unité msxmldom ) et vous obtiendrez le même comportement. Vous pouvez également remplacer la variable globale DefaultDOMVendor par SMSXML pour que tous les nouveaux objets TXmlDocument utilisent ce fournisseur.

Autres conseils

Avez-vous déjà essayé OmniXML ? Je l'utilise depuis des années et il a toujours résolu mes problèmes concernant les fichiers XML. Sinon, je vous conseillerais de l'essayer: il est simple à utiliser, léger et gratuit.

Internet Explorer utilise Open XML implémente un résolveur à l'aide de TStandardResourceResolver

Au revoir.

Ce qui suit a résolu le problème pour moi. Il semble que l'analyseur par défaut de Delphi (MSXML) inclue en réalité des références d'entité externe, mais d'une manière quelque peu étrange. Pour cet exemple

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

J'ai supposé que la création d'un document TXML et que le fichier externe contenait un texte simple, je pouvais obtenir le contenu du fichier comme ceci:

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

Cela fonctionne réellement si la référence à l'entité est remplacée par le texte simple. Toutefois, en cas d'utilisation de l'entité externe, Delphi créera un nouvel enfant de type "ntEntityRef". à l'intérieur du & schéma; schéma " nœud. Ce nœud aura également un enfant qui contient finalement le texte simple que j'attendais. Le texte peut être consulté comme ceci:

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

Si le fichier d'entité externe contient une structure de nœud, les nœuds correspondants seront créés à l'intérieur du nœud de référence d'entité. Assurez-vous que TXMLDocument.ParseOptions est défini sur au moins sur [poResolveExternals] pour que cela se produise. Cette approche facilite également l'adaptation du code généré par l'Assistant de liaison de données XML afin qu'il fonctionne avec des entités externes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top