2009-10-16 24 views
6

Tengo un documento XML que cargué e intento buscar con XPath. El nodo raíz en este archivo es <t:Transmission xmlns:t='urn:InboundShipment'> y el archivo final se cierra correctamente con </t:Transmission>.XML de análisis: Dos puntos en mi elemento hacen que XPath lo pierda

Mi problema es que no puedo caminar por el árbol sin usar un eje descendente. En otras palabras, puedo hacer: SelectSingleNode("//TransactionHeader[SHIPPERSTATE='CA']") y obtener un nodo a cambio. Pero no puedo hacer lo que debería ser el equivalente: SelectSingleNode("/Transmission/TransmissionBody/Transaction/TransactionHeader[SHIPPERSTATE='CA']")

Si elimino el t: puedo hacer una búsqueda XPath en /Transmission y obtener el archivo completo. Con el t: allí solo obtengo nulo. O si intento SelectSingleNode("t:Transmission") me sale un error con mi declaración XPath.

Por lo general, no es necesario que consulte el elemento raíz, por lo que debería ser capaz de hacer con solo usar el eje descendente para mis búsquedas. Pero el XML parece válido para mí y me gustaría saber cómo solucionarlo. Además, no quiero pedirle al cliente que elimine "t" solo porque no sé cómo manejarlo.

Respuesta

8

La "t:" es un prefijo de espacio de nombres, que está vinculado al espacio de nombres 'urn: InboundShipment'. Para manejarlo adecuadamente, debe decirle a C# a qué está obligado el prefijo. This page debe explicar cómo usar System.Xml.XmlNamespaceManager para manejar el espacio de nombres.

Editar: Ver también this answer.

+0

Impresionante, gracias James! Grandes referencias, también. –

Cuestiones relacionadas