2012-06-07 3 views
0

J'ai cette entrée XML:Comment puis-je obtenir l'analyseur Open XML DOM pour analyser un nœud ntEntityRef?

<?xml version="1.0" encoding="utf-8"?> 
<string> 
&lt;N/A&gt; 
</string> 

Voici un exemple de code court pour illustrer le problème:

uses 
    xmldom, oxmldom, XMLDoc, XMLIntf; 

procedure TForm1.Test; 
var 
    Document  : IXMLDocument; 
    StringNode : IXMLNode; 
    LessThanNode : IXMLNode; 
begin 
    DefaultDOMVendor := 'Open XML'; 
    Document   := LoadXMLData(Memo1.Lines.Text); 
    StringNode  := Document.DocumentElement; 
    LessThanNode  := StringNode.ChildNodes.First; 
    ShowMessage(LessThanNode.Text); // Displays '' (an emtpy string) 
    ShowMessage(LessThanNode.XML); // Displays '&lt;' 
    ShowMessage(StringNode.Text); // Causes an EXMLDocError, because the string node contains more than just a single node with NodeType = ntText 
end; 

Comment puis-je obtenir l'analyseur Open XML pour transformer les &lt;, &gt et entités XML similaires à leur vrai texte (comme < et >)?

Je pourrais écrire une solution de contournement pour les entités prédéfinies dans la spécification XML: http://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent

Cela ne va pas aider avec l'entité nœuds supplémentaires si ...

connexes: Why doesn't IXMLNode.IsTextElement return True for CDATA elements?

+0

Avez-vous essayé de valider un document en utilisant OpenXML? – Pol

+0

@Pol - pourquoi voudrait-il faire ça? –

Répondre

0

Les nouvelles versions de Delphi ne pas envoyer les versions unité de oxmldom plus et plus récentes de la soi-disant ADOM sont disponibles:

http://www.philo.de/xml/downloads.shtml

Donc, soit en utilisant un OpenXML analyseur ou la mise à niveau différent permet de résoudre le problème.

1

Dans votre cas, je pense que la propriété InnerText devrait fonctionner.

ShowMessage(Document.DocumentElement.InnerText); 

Edit: La InnerText propriété ne fait pas partie de l'interface IXMLNode (je pense que MSXML a.) La mise en œuvre OpenXML (ADOM) a une méthode GetTextContent qui fait probablement la même chose, vous voudrez peut-être à regarder dedans.

+1

Il n'y a pas de 'InnerText' dans' IXMLNode' (au moins dans D2007). À moins que je ne manque quelque chose ici? –