2010-08-06 3 views
9

J'essaie d'apprendre XPath. La théorie semble extrêmement simple, sauf pour le fait que cela ne fonctionne pas.Utilisation XPATH pour accéder aux éléments XML (était: Bon tutoriel pour apprendre xpath)

Je suis en train d'obtenir le contenu de chaque élément cible

XPathDocument doc = new XPathDocument(sPath); 
XPathNavigator nav = doc.CreateNavigator(); 
XPathExpression expr; 
expr = nav.Compile("/doc/file/body/trans-unit/target"); 
XPathNodeIterator iterator = nav.Select(expr); 

while (iterator.MoveNext()) 
{ 
    XPathNavigator nav2 = iterator.Current.Clone(); 
    sbDoc.Append(nav2.InnerXml); 
} 

Le doc XML ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<doc version="1.2"> 
    <file original="affiliate.php" source-language="EN-US" target-language="FR-FR" datatype="php"> 
    <header> 
     <skl> 
     <external-file href="affiliate.php"/> 
     </skl> 
    </header> 
    <body> 
     <trans-unit id="tu1"> 
     <source xml:lang="EN-US">Your Program Details</source> 
     <target xml:lang="FR-FR">Your Program Details</target> 
     </trans-unit> 
     <trans-unit id="tu2"> 
     <source xml:lang="EN-US">Status</source> 
     <target xml:lang="FR-FR">Status</target> 
     </trans-unit> 

C'est presque mot pour mot d'un tutoriel, mais je peux » t le faire fonctionner. Lorsque l'itérateur est créé, en mode débogage, je peux voir que le document est chargé, mais l'itérateur ne trouve aucun résultat et ignore la boucle While. Je fais probablement quelque chose d'extrêmement stupide, mais quoi?

Quelqu'un sait où je peux trouver un bon tutoriel XPATH fiable?


Merci à tous. Il s'avère que j'ai ignoré le fait qu'il y avait un espace de noms (que j'ai supprimé en simplifiant le code XML car je n'avais pas réalisé qu'il était important), et avec l'ajout d'un gestionnaire d'espace de noms, le code fonctionne bien.

J'étudie maintenant les tutoriels XPATH proposés et ils ont l'air bien.

Répondre

8

Le code XML n'est peut-être pas celui que vous avez publié, mais il contient une déclaration d'espace de nom par défaut. C'est la raison principale pour laquelle les expressions XPath écrites par les débutants ne sélectionnent pas ce qu'ils veulent sélectionner. Vous auriez besoin d'un XmlNamespaceManager http://msdn.microsoft.com/en-us/library/6k4x060d.aspx dans ce cas.

+0

Merci Martin. Vous avez raison, il y avait un espace de noms sur l'original que j'ai enlevé en "simplifiant" le fichier XML, et bien sûr, maintenant cela fonctionne. – Sylverdrag

+1

@Sylverdrag: Et comment cette réponse sert le titre de votre question ** "Bon tutoriel pour apprendre xpath" **. Je pense que vous devriez éditer cela. –

+0

@Alejandro: C'était une question 2-en-1, et je dois en quelque sorte la remettre à la personne qui parvient à repérer le problème sous-jacent, bien que j'ai remis en question les bonnes réponses du tutoriel. – Sylverdrag

9

Je vais pour la W3Schools tutorial classique. C'est comme ça que j'ai appris, et ça m'a bien fait. Couvre définitivement toutes les bases.

+0

+1 votre trop vite;) –

+0

Cela ressemble à un super tutoriel. Merci! – Sylverdrag

3

J'ai toujours trouvé ce tutoriel/référence très utile ... http://zvon.org/comp/r/tut-XPath_1.html#

MISE À JOUR
je votre code et document XML et a été en mesure de récupérer les éléments cibles sans problème. J'ai dû fermer vos éléments <body>, <file> and <doc> à la fin de votre document XML, mais je suppose qu'il s'agit d'un problème de copier-coller. Je suppose que ma question serait (et c'est trop évident), êtes-vous sûr que le document XML est chargé et que celui qui est chargé contient le contenu que vous recherchez? J'ai copié votre document XML et codé en dur le chemin dans le constructeur XPathDocument, et tout a bien fonctionné (ce qui signifie que le StringBuilder avait le texte des éléments <target>).

Également essayé l'encodage ANSI et UTF-8 - pas de problème. J'utilise VS2010 pour mon environnement de développement.

3

J'ai trouvé que les tutoriels sur zvon sont plutôt bons. Il s'agit du XPath tutorial

1

JQuery prend en charge l'expression XPath de base, vous pouvez l'utiliser pour s'exercer à écrire des sélecteurs XPath.

+0

Ja! Ja! Nous voyons toujours des réponses à des questions techniques sur javascript (et même sur CSS) recommandant d'utiliser une bibliothèque comme JQuery. Mais je ne l'ai jamais vu recommandé comme tutoriel! –

+0

@Alejandro: P .. – satoru

0

Je trouve que le support de xpath fortement typé fait défaut dans .Net. Voici une bibliothèque pour générer xpath en utilisant des expressions linq-esq.

http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq

Exemple:

var xpath = CreateXpath.Where(e => e.TargetElementName == "td" && 
            e.TargetElementText.Contains("my test")); 

xpath generated: //td[contains(text(),'my test')] 
2

Je suis en retard à la fête, mais affichera pour les demandeurs.

Obtenez XPathbuilder. Si vous souhaitez apprendre xpath, procurez-vous cet outil, un exemple de fichier xml tordu, ouvrez la section d'aide dans xpath et essayez-le. Je l'utilise en ce moment et je ne peux pas croire qu'il m'a fallu 5 minutes pour sélectionner les choses dont j'ai besoin. (Fichier de configuration de cauchemar en tant que xml).

Questions connexes