2010-08-06 14 views
9

Estoy tratando de aprender XPath. La teoría parece extremadamente simple, excepto por el hecho de que no funciona.Usando XPATH para acceder a elementos XML (fue: buen tutorial para aprender xpath)

Estoy tratando de obtener el contenido de cada elemento de destino

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

El documento XML tiene el siguiente aspecto:

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

Esto es casi palabra por palabra de un tutorial, pero puedo' Lo hago funcionar. Cuando se crea el iterador, en el modo de depuración, puedo ver que el documento está cargado, pero el iterador no encuentra ningún resultado y omite el ciclo While.

Probablemente estoy haciendo algo extremadamente estúpido, pero ¿qué?

¿Alguien sabe dónde puedo encontrar un buen y confiable tutorial de XPATH?


Gracias a todos. Resulta que ignoré el hecho de que había un espacio de nombres (que eliminé al simplificar el código XML ya que no me di cuenta de que era importante), y con la adición de un administrador de espacio de nombres, el código funciona bien.

Ahora estoy estudiando los tutoriales de XPATH propuestos y se ven bien.

Respuesta

8

Quizás el XML no sea el que ha publicado pero tiene una declaración de espacio de nombres predeterminada. Esa es la razón principal por la cual las expresiones XPath escritas por principiantes no seleccionan lo que desean seleccionar. Necesitaría un XmlNamespaceManager http://msdn.microsoft.com/en-us/library/6k4x060d.aspx en ese caso.

+0

Gracias Martin. Tiene razón, había un espacio de nombres en el original que eliminé al "simplificar" el archivo XML, y por supuesto, ahora funciona. – Sylverdrag

+1

@Sylverdrag: Y cómo esta respuesta sirve al título de su pregunta ** "Buen tutorial para aprender xpath" **. Creo que deberías editar eso. –

+0

@Alejandro: Era una pregunta 2 en 1, y tengo que entregársela a la persona que se las arregla para detectar el problema subyacente, a pesar de que voté positivamente las buenas respuestas del tutorial. – Sylverdrag

9

me gustaría ir para el clásico W3Schools tutorial. Así es como aprendí, y me fue bien. Definitivamente cubre todos los conceptos básicos.

+0

+1 demasiado rápido;) –

+0

Parece un gran tutorial. ¡Gracias! – Sylverdrag

3

Siempre he encontrado este tutorial/referencia a ser muy útil ... http://zvon.org/comp/r/tut-XPath_1.html#

ACTUALIZACIÓN
utilicé su código y documento XML y fue capaz de recuperar los elementos de destino sin problema. Tuve que cerrar tus elementos <body>, <file> and <doc> al final de tu documento XML, pero asumo que es un problema de cortar y pegar. Supongo que mi pregunta sería (y esto es demasiado obvio), ¿estás seguro de que el documento XML se está cargando y que el que realmente tiene carga tiene el contenido que estás buscando? Copié su documento XML y codifiqué la ruta en el constructor XPathDocument, y todo funcionó bien (es decir, StringBuilder tenía el texto de los elementos <target>).

También se probó la codificación ANSI y UTF-8 - no hay problema.

Estoy usando VS2010 para mi entorno de desarrollo.

3

Encontré que los tutoriales en zvon son bastante buenos.

Aquí está el XPath tutorial.

1

JQuery admite la expresión XPath básica, puede usarla para practicar la escritura de selectores XPath.

+0

Ja! Ja! Siempre vemos respuestas a preguntas técnicas sobre javascript (e incluso sobre CSS) recomendando utilizar una biblioteca como JQuery. ¡Pero nunca lo he visto recomendado como el tutorial! –

+0

@Alejandro: P .. – satoru

0

Me parece que falta soporte de xpath fuertemente tipado en .Net. Aquí hay una biblioteca para generar xpath usando expresiones linq-esq.

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

Ejemplo:

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

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

llego tarde a la fiesta, pero publicará para los buscadores.

Obtenga XPathbuilder. Si desea aprender xpath, obtenga esta herramienta, un ejemplo de archivo xml retorcido, abra la sección de ayuda en xpath y pruébela.

Lo estoy usando ahora mismo y no puedo creer que me tomó 5 minutos seleccionar las cosas que necesito. (archivo de configuración de pesadilla como xml).