tengo algo de XML con espacio de nombres predeterminadoXML-SelectNodes con default-espacio de nombres a través de XmlNamespaceManager no funciona como se esperaba
<a xmlns='urn:test.Schema'><b/><b/></a>
y quiero contar el número de <b/>
? ¿Cómo tengo que definir
XmlNamespaceManager nsmgr = ????
Assert.AreEqual(2, doc.SelectNodes("//b", nsmgr).Count);
de manera que la aserción es verdadera?
que he probado hasta ahora (usando nunit):
[Test]
[Ignore("Why does this not work?")]
public void __DoesNotWork_TestSelectWithDefaultNamespace()
{
// xml to parse with defaultnamespace
string xml = @"<a xmlns='urn:test.Schema'><b/><b/></a>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
// fails because xpath does not have the namespace
//!!!!
Assert.AreEqual(2, doc.SelectNodes("//b").Count);
// using XPath defaultnamespace
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("", "urn:test.Schema");
// This will fail with dotnet 3.5sp1. Why?
//!!!!
Assert.AreEqual(2, doc.SelectNodes("//b", nsmgr).Count);
}
[Test]
public void TestSelectWithoutNamespaces_Ok()
{
// xml to parse without namespace
string xml = @"<a><b/><b/></a>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
// works ok
Assert.AreEqual(2, doc.SelectNodes("//b").Count);
// works ok
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
Assert.AreEqual(2, doc.SelectNodes("//b", nsmgr).Count);
}
[Test]
public void TestSelectWithNamespacesPrefixed_Ok()
{
// xml to parse with defaultnamespace
string xml = @"<a xmlns='urn:test.Schema'><b/><b/></a>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
// using XPath namespace via alias "t". works ok but xpath is to complicated
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("t", doc.DocumentElement.NamespaceURI);
Assert.AreEqual(2, doc.SelectNodes("//t:b", nsmgr).Count);
}
gracias por su respuesta. usted describió lo mismo que lo que hace el tercer TestSelectWithNamespacesPrefixed_Ok() más inerte. Todavía espero que hay una workaroud sin la necesidad de modificar la expresión XPath- – k3b
@ k3b: Usted escribió * Todavía espero que hay una workaroud sin la necesidad de modificar la expresión XPath *. No. Esto es preguntas frecuentes: una prueba de QName sin prefijo selecciona elementos en el URI nulo (o vacío) del espacio de nombres, no en el espacio de nombres predeterminado. –
@ k3B: No, no hay tal solución: está escrito en la especificación XPath W3C: "Un QName en la prueba de nodo se expande en un nombre expandido usando las declaraciones de espacio de nombres del contexto de la expresión.Esta es la misma forma de expansión para los nombres de tipos de elementos en las etiquetas de inicio y final, excepto que no se usa el espacio de nombres predeterminado declarado con xmlns: si QName no tiene un prefijo, entonces el URI del espacio de nombres es nulo "ver esto en: http://www.w3.org/TR/xpath/#node-tests. Por lo tanto, cualquier nombre no prefijado se considera que está en "sin espacio de nombres". No hay elementos 'b' en" sin espacio de nombres "y obtienes 0 nodos –