2010-01-16 17 views
5

tengo un xml con varios espacios de nombres que me gustaría realizar consultas mediante .SelectNodes (cadena xRuta)XPath para el espacio de nombres XML con

El problema que noto es que la consulta XPath retorno nada, siempre y cuando tengo todos esos espacios de nombres alrededor.

  1. de todos modos hay que contar XmlDocument.SelectNodes hacer caso omiso de esos espacios de nombres y simplemente me los elementos correctos (los elementos que consulta no parecen tener espacios de nombres de prefijo)?

  2. si existe, ¿alguien puede darme un ejemplo de cómo hacerlo? ¿Qué debería haber definido antes/cuando consulto los nodos?

Gracias por la ayuda.

Corrección: todavía no puedo entender cuál es el problema. aquí está mi xml:

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gf="http://schemas.google.com/finance/2007" 
     xmlns:gd="http://schemas.google.com/g/2005" > 
    <id>http://finance.google.com/finance/feeds/[email protected]/portfolios</id> 
    <updated>2009-12-15T19:32:21.000Z</updated> 
    <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/finance/2007#portfolio" /> 
    <title type="text" >Portfolio Feed</title> 
    <link rel="alternate" type="text/html" href="http://finance.google.com/finance/portfolio?action=view" /> 
    <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://finance.google.com/finance/feeds/default/portfolios" /> 
    <link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="http://finance.google.com/finance/feeds/default/portfolios" /> 
    <link rel="self" type="application/atom+xml" href="http://finance.google.com/finance/feeds/default/portfolios" /> 
    <openSearch:totalResults>24</openSearch:totalResults> 
    <openSearch:startIndex>1</openSearch:startIndex> 
    <openSearch:itemsPerPage>24</openSearch:itemsPerPage> 
    <entry> 
    <id>http://finance.google.com/finance/feeds/[email protected]/portfolios/2</id> 
    <updated>2009-12-14T16:26:53.000Z</updated> 
    <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/finance/2007#portfolio" /> 
    <title type="text" >Main</title> 
    <link rel="self" type="application/atom+xml" href="http://finance.google.com/finance/feeds/default/portfolios/2" /> 
    <link rel="edit" type="application/atom+xml" href="http://finance.google.com/finance/feeds/default/portfolios/2" /> 
    <gd:feedLink href="http://finance.google.com/finance/feeds/[email protected]/portfolios/2/positions" /> 
    <gf:portfolioData currencyCode="USD" gainPercentage="0.0" return1w="0.0" return1y="0.0" return3m="0.0" return3y="0.0" return4w="0.0" return5y="0.0" returnOverall="0.0" returnYTD="0.0" /> 
    </entry> 
</feed> 

y aquí está mi código:

XmlDocument xml = ExecuteRequest (url);

 var xmlnsManager = new System.Xml.XmlNamespaceManager(xml.NameTable); 
     xmlnsManager.AddNamespace("xmlns:openSearch", "http://a9.com/-/spec/opensearchrss/1.0/"); 
     xmlnsManager.AddNamespace("xmlns:gf", "http://schemas.google.com/finance/2007"); 
     xmlnsManager.AddNamespace("xmlns:gd", "http://schemas.google.com/g/2005"); 

     var nodes = xml.SelectNodes("//feed/entry", xmlnsManager); 

y mis nodos cuentan todavía es 0! ¿alguna idea?

Respuesta

-1

encontrado el problema en otro post aquí: No Nodes Selected from Atom XML document using XPath?

gracias a todo el mundo.

+1

Las respuestas de solo enlace son respuestas deficientes. Debe incluir el contenido sustantivo de la respuesta vinculada. Sin embargo, en este caso, una vez que haga eso, su respuesta se parecerá a [la respuesta de Darrel Miller arriba] (http://stackoverflow.com/a/2075794/2704659), que, en mi opinión, debería ser la respuesta aceptada aquí, no es tuyo. –

9

Necesita crear un administrador de espacio de nombres, configurar todos los espacios de nombres que desea usar y su prefijo y luego en el XPath, necesita usar el prefijo.

var doc = new XmlDocument(); 
doc.Load("myfile.xml"); 

var xmlnsManager = new System.Xml.XmlNamespaceManager(doc.NameTable); 
xmlnsManager.AddNamespace("ns", "http://example.org/schema.xsd"); 

doc.SelectNodes("//ns:MyElement",xmlnsManager); 

Advertencia: No he recopilado este código.

+1

+1, compila bien –

2

no estoy tan familiarizado con la API .NET, pero es posible que pueda enviar en un XPATH más genérico que ignora los espacios de nombres, haciendo coincidir en cualquier elemento (por ejemplo. *) y usando el local-name en los filtros de predicado.

p. Ej. usando /*[local-name()='foo']/*[local-name()='bar']/*[local-name()='baz'] para encontrar ns:foo/ns:bar/ns:baz sin declarar ns namespace.

De esta manera no tiene que enlazar a un espacio de nombres en particular en el momento de la compilación y puede pasar en las declaraciones XPATH de arbritrary.

Obviamente, al usar las declaraciones XPATH sin espacio de nombres, puede obtener resultados no deseados (si hay contenido de espacio de nombres mezclado con elementos del mismo nombre) y XPATH es realmente detallado.

En XPath 2.0 Puede utilizar comodines para espacios de nombres: /*:foo/*:bar/*:baz, pero que habría que utilizar para conseguir SaxonXSLT/XPath 2.0 apoyo en .NET.

+0

En realidad, Altova tiene un procesador XSLT 2.0 gratuito basado en COM pero que se puede acceder desde .Net. (http://www.altova.com/altovaxml.html) e Intel lanzaron recientemente el procesador XSLT 2.0 que se ejecuta en las ventanas de 64 bits. http://software.intel.com/en-us/articles/intel-soa-expressway-xslt-20-processor/ –

Cuestiones relacionadas