J'ai quelques xml avec espace de noms par défautXml-SelectNodes avec défaut-espace de noms via XmlNamespaceManager ne fonctionne pas comme prévu
<a xmlns='urn:test.Schema'><b/><b/></a>
et que vous souhaitez compter le nombre de <b/>
Comment dois-je définir
XmlNamespaceManager nsmgr = ????
Assert.AreEqual(2, doc.SelectNodes("//b", nsmgr).Count);
afin que l'affirmation devienne vraie?
Je l'ai essayé jusqu'à présent (en utilisant 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);
}
merci pour votre réponse. vous avez décrit la même chose que ce que fait le troisième unitest TestSelectWithNamespacesPrefixed_Ok(). j'espère toujours qu'il y a un workaroud sans avoir besoin de modifier l'expression xpath – k3b
@ k3b: Vous avez écrit * j'espère toujours qu'il y a un workaroud sans avoir besoin de modifier l'expression xpath *. Non. Ceci est une FAQ: un test QName sans préfixe sélectionne des éléments dans l'URI d'espace de noms nul (ou vide), pas dans l'espace de noms par défaut. –
@ k3B: Non, il n'y a pas de solution de contournement - Il est écrit dans la spécification XPath W3C: "Un QName dans le test de nœud est développé en un nom étendu en utilisant les déclarations d'espace de noms du contexte d'expression.C'est la même chose que pour les noms de types d'éléments dans les balises start et end sauf que l'espace de noms par défaut déclaré avec xmlns n'est pas utilisé: si le QName n'a pas de préfixe, l'URI d'espace de nommage est nul. http://www.w3.org/TR/xpath/#node-tests Ainsi, tout nom non préfixé est considéré comme étant dans "no namespace" Il n'y a pas d'éléments 'b' dans" no namespace "et vous obtenez 0 nœuds –