2011-10-31 11 views
6

Siento molestarte con una pregunta tan sencilla, pero me tengo que quedar aquí desde una hora:XmlElement.SelectNodes (..) - no encuentra nada .. ¿Ayuda?

Tengo un archivo XML que se ve algo como esto:

<?xml version="1.0" encoding="utf-8"?> 
<aaa xmlns="http://blabla.com/xmlschema/v1"> 

    <bbb> 
    <ccc>Foo</ccc> 
    </bbb> 

    <ddd x="y" /> 
    <ddd x="xx" /> 
    <ddd x="z" /> 

</aaa> 

Estoy intentando acceder los elementos 'ddd' como esto:

var doc = new XmlDocument(); 
doc.Load("example.xml"); 
foreach (XmlNode dddNode in doc.DocumentElement.SelectNodes("//ddd")) 
{ 
    // do something 
    Console.WriteLine(dddNode.Attributes["x"].Value); 
} 

En tiempo de ejecución del bucle foreach se omite porque no consigo ningún nodo posterior del método .SelectNodes. Rompí antes del ciclo y eché un vistazo a InnerXML, que se ve bien, y también probé todo tipo de XPath (como "// bbb" o "/ aaa/ddd"), pero solo "/" parece no regresar nulo.

Este código exacto funcionó para mí antes, ahora no es así. Sospecho que algo con esa declaración de espacio de nombres en la etiqueta aaa, pero no pude entender por qué esto debería causar problemas. O ... ¿puedes ver algo que me pueda estar perdiendo?

Respuesta

10

Esto es xml-namespaces. No hay ddd. Sin embargo, x:ddd donde x es su alias al http://blabla.com/xmlschema/v1. Tendrá que probar con espacios de nombres - por ejemplo:

var nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("x", "http://blabla.com/xmlschema/v1"); 
var nodes = doc.DocumentElement.SelectNodes("//x:ddd", nsmgr); 
// nodes has 3 nodes 

Nota x en lo anterior es arbitraria; no hay importancia en x que no sea la conveniencia.

Este (en vez inconvenientemente) significa agregar el espacio de nombres (o un alias, como el anterior) en todo de sus expresiones XPath.