2009-09-17 4 views
1

J'ai un document XML, je veux faire de la coloration syntaxique. Le code utilise XPathDocument, XPathNavigator et XPathNodeIterator. Après avoir appelé Select(), comment puis-je obtenir le texte original dans le document XML?Est-il possible de récupérer le code XML d'origine à partir de XPathNavigator?

var xpathDoc = new XPathDocument(new StringReader(this.richTextBox1.Text)); 
var nav = xpathDoc.CreateNavigator(); 
XmlNamespaceManager xmlns = new XmlNamespaceManager(nav.NameTable); 
xmlns.AddNamespace("ns1", "urn:myxnlnamespace"); 
XPathNodeIterator selection = nav.Select(xpathExpression, xmlns); 

foreach (XPathNavigator node in selection) 
{ 
    // Here, node.OuterXml includes an explicit namespace. 
    // If the original raw xml fragment for this node was 
    // <ElementName>Text</ElementName> 
    // and if xmlns="urn:myxnlnamespace" is used on the root of the document.... 
    // 
    // OuterXml will return 
    // <ElementName xmlns="urn:myxnlnamespace">Text</ElementName> 
    // 
    // InnerXml will return "Text" in this example. 
    // 
    // How can I get the original, raw XML bytestream for this node? 
    // Like this: 
    // <ElementName>Text</ElementName> 
    // 
} 

Il travaillerait aussi, pour moi, pour obtenir le IXmlLineInfo du début et à la fin du noeud sélectionné. Maintenant, je peux aller au début du nœud sélectionné et obtenir IXmlLineInfo pour cela. Mais je sais seulement comment passer au nœud suivant (MoveToNext()); Je ne sais pas comment passer à et du nœud actuel. De plus, cette approche ne fonctionne pas si le nœud en question est le dernier d'une séquence (plus de frères et soeurs).

Cela fonctionnerait également s'il y avait une expression xpath qui renvoyait le texte brut complet du nœud courant. Jusqu'à présent, je ne peux pas trouver quelque chose comme ça non plus.


EDIT: je me suis déplacé au-delà de ce problème via un hack sans vergogne. Pour déterminer la longueur du texte que je dois mettre en évidence, j'analyse manuellement le texte xml d'origine, en cherchant des chevrons et des jetons de noms. Ce n'est pas joli mais en l'absence de quelque chose de mieux, cela fonctionne pour les fichiers XML simples.

Je suis toujours intéressé par une vraie réponse, si quelqu'un en a une.

+0

@Cheeso Je ne pense pas qu'il existe une meilleure solution à ce problème que ce que propose IE depuis 9-10 ans. C'est pourquoi je recommande la manière de XPath Visualizer de le faire, qui est essentiellement une adaptation de la feuille de style d'IE, de sorte qu'elle est maintenant écrite en XSLT 1.0 conforme (pas dans l'ancien xsl de Microsoft). –

+0

Est-ce que cette approche produit du HTML? Comment puis-je appliquer une surbrillance à un ensemble de nœuds dans le document XML? – Cheeso

+0

Comme je l'ai déjà dit dans ma réponse, étudiez le code du XPath Visualizer! :) Dans le cas où vous avez peur d'obtenir le XPath Visualizer de topxml.com (le site est plein de trojans !!!), s'il vous plaît, contactez-moi à dnovatchev at gmail dot com –

Répondre

0

Vous trouverez peut-être utile la façon dont le XPath Visualizer effectue la syntaxe hilighting d'un document XML.

+0

Merci, Dimitre. Votre outil a été autour d'un temps loooong, hein? Je voulais le mien alors j'en ai construit un. http://XpathVisualizer.codeplex.com Je suis venu sur cette question en essayant de mettre en surbrillance pour travailler. – Cheeso

+0

@Cheeso Je ne pense pas qu'il y ait une meilleure solution à cela que ce qu'EI proposait depuis 9-10 ans. C'est pourquoi je recommande la manière de XPath Visualizer de le faire, qui est essentiellement une adaptation de la feuille de style d'IE, de sorte qu'elle est maintenant écrite en XSLT 1.0 conforme (pas dans l'ancien xsl de Microsoft). –

Questions connexes