2010-08-06 11 views
9

Sto cercando di imparare XPath. La teoria sembra estremamente semplice, fatta eccezione per il fatto che non funziona.Utilizzando XPath per accedere agli elementi XML (era: buon tutorial per imparare XPath)

Sto cercando di ottenere il contenuto di ogni elemento di destinazione

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); 
} 

Il documento XML è simile al seguente:

<?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> 

Questo è quasi parola per parola da un tutorial, ma posso' Lo faccio funzionare. Quando viene creato l'iteratore, in modalità di debug, posso vedere che il documento è caricato, ma l'iteratore non trova alcun risultato e salta il ciclo While.

probabilmente sto facendo qualcosa di estremamente stupido, ma che cosa?

Qualcuno sa dove posso trovare un buon tutorial XPATH affidabile?


Grazie a tutti. È venuto fuori che ho ignorato il fatto che c'era uno spazio dei nomi (che ho rimosso mentre semplificavo il codice XML perché non avevo capito che era importante) e, con l'aggiunta di un gestore di namespace, il codice funziona correttamente.

Ora sto studiando le esercitazioni XPATH proposte e sembrano belle.

risposta

8

Forse l'XML non è quello che hai postato ma ha una dichiarazione dello spazio dei nomi predefinita. Questa è la ragione principale per cui le espressioni XPath scritte dai principianti non selezionano ciò che vogliono selezionare. In tal caso, è necessario un XmlNamespaceManager http://msdn.microsoft.com/en-us/library/6k4x060d.aspx.

+0

Grazie Martin. Hai ragione, c'era un namespace sull'originale che ho rimosso quando "semplificavo" il file XML e, naturalmente, ora funziona. – Sylverdrag

+1

@Sylverdrag: E come questa risposta serve al titolo della tua domanda ** "Buon tutorial per imparare xpath" **. Penso che dovresti modificarlo. –

+0

@Alejandro: Era una domanda 2 in 1, e devo consegnarlo alla persona che riesce a individuare il problema sottostante, anche se ho fatto invertire le buone risposte del tutorial. – Sylverdrag

9

mi piacerebbe andare per il classico W3Schools tutorial. È così che ho imparato, e mi ha fatto bene. Copre sicuramente tutte le basi.

+0

+1 troppo veloce;) –

+0

Sembra un ottimo tutorial. Grazie! – Sylverdrag

3

ho sempre trovato questo tutorial/di riferimento per essere molto utile ... http://zvon.org/comp/r/tut-XPath_1.html#

UPDATE
ho usato il codice e documento XML e stato in grado di recuperare gli elementi di destinazione senza alcun problema. Ho dovuto chiudere gli elementi <body>, <file> and <doc> alla fine del documento XML, ma suppongo che si tratti di un problema di copia e incolla. Credo che la mia domanda sarebbe (e questo è troppo ovvio), sei sicuro che il documento XML viene caricato e che quello che carica ha effettivamente il contenuto che stai cercando? Ho copiato il documento XML e hard-coded il percorso nel costruttore XPathDocument, e tutto ha funzionato bene (significato, la StringBuilder ha avuto il testo dal <target> elementi).

Anche provato entrambe le codifiche ANSI e UTF-8 - nessun problema.

Sto usando VS2010 per il mio ambiente di sviluppo.

3

Ho trovato che le esercitazioni su zvon sono abbastanza buone.

Questo è il XPath tutorial.

1

JQuery supporta l'espressione di base XPath, è possibile utilizzarlo per esercitarsi nella scrittura di selettori XPath.

+0

Ja! Ja! Vediamo sempre le risposte alle domande tecniche su javascript (e persino sui CSS) che raccomandano l'uso di una libreria come JQuery. Ma non l'ho mai visto raccomandato come tutorial! –

+0

@ Alejandro: P .. – satoru

0

Trovo che il supporto xpath fortemente tipizzato manchi in .Net. Ecco una libreria per generare xpath usando espressioni linq-esq.

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

Esempio:

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

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

Sono in ritardo alla festa, ma pubblicheremo per i cercatori.

Ottieni XPathbuilder. Se desideri imparare xpath, procurati questo strumento, un file xml di esempio, apri la sezione di aiuto in xpath e provalo.

Lo sto usando proprio ora e non posso credere di aver impiegato 5 minuti per selezionare le cose di cui ho bisogno. (file di configurazione da incubo come xml).