web-dev-qa-db-fra.com

Accès aux commentaires en XML à l'aide de XPath

Comment accéder aux commentaires à l'intérieur du document XML à l'aide de XPath?

Par exemple:

<table>
<length> 12 </length>
<!--Some comment here-->
</table>

Je veux accéder au "Quelques commentaires ici".

Merci...

EDIT: J'utilise MSXML DOM ActiveX et la commande comment () semble échouer ... Une idée pourquoi?

45
Manoj

Avec le chemin

/foo/bar/comment()

vous pouvez sélectionner tous les commentaires dans l'élément/foo/bar. Cela peut dépendre de la langue de votre choix, bien sûr. Mais c'est généralement ainsi que vous procédez.

57
Björn

Utilisez la fonction comment () par exemple: -

/table/length/following::comment()[1]

sélectionne le premier commentaire qui suit l'élément de longueur.

Modifier

Manoj demande dans un commentaire à cette réponse pourquoi cela ne fonctionne pas dans MSXML. La raison en sera que vous utilisez MSXML3. Par défaut, MSXML3 n'utilise pas XPath comme langue de sélection, il utilise par défaut une langue beaucoup plus faible antérieure (modèle XSL). Vous devez définir XPath comme langue de sélection via la méthode setProperty de DOMDocument. Par exemple (en JScript): -

var dom = new ActiveXObject("MSXML2.DOMDocument.3.0");
dom.setProperty("SelectionLanguage", "XPath");

Maintenant, le langage XPath complet fonctionnera dans vos requêtes (notez qu'un changement majeur est que les prédicats de l'indexeur sont 1 basés sur XPath alors qu'ils étaient 0 basés sur XSL Pattern).

19
AnthonyWJones

Sur la base des commentaires du PO aux réponses publiées (et de ma curiosité pour savoir pourquoi cette chose simple ne fonctionnerait pas), voici ma suggestion:

En utilisant l'expression XPath suggérée par @ Anthony , j'ai réussi à charger le nœud de commentaire avec la fonction JS suivante:

function SelectComment(s)
{
  var xDoc = new ActiveXObject("MSXML2.DOMDocument.6.0");
  if (xDoc)
  {
    xDoc.loadXML(s);
    var selNode = xDoc.selectSingleNode("/table/length/following::comment()[1]");
    if (selNode != null)
      return selNode.text;
    else
      return "";
  }
}

Exemple d'appel:

SelectComment("<table><length> 12</length><!--Some comment here--></table>");

Production:

"Some comment here"

Remarques:

une. Votre version MSXML peut varier. Veuillez utiliser de manière appropriée.

b. Ce type de code n'est certainement pas recommandé car il ne fonctionne que sur IE. Cependant, puisque c'est votre exigence explicite, j'ai utilisé l'ActiveXObject.

c. Vous n'avez pas mentionné dans vos commentaires ce qui échoue dans les expressions XPath suggérées. Je suppose que vous n'interrogez pas la propriété text du nœud récupéré. Gardez à l'esprit que SelectSingleNode renvoie toujours un IXmlNode et vous devez interroger ses propriétés data ou text.

3
Cerebrus

Peut-être que cela pourrait aider, cet exemple supprime les commentaires

XmlNodeList list = xmlDoc.SelectNodes("//comment()");
foreach(XmlNode node in list)
node.ParentNode.RemoveChild(node);

Appris d'ici texte du lien

1
adopilot