Pourquoi ne tombe XElement plus lors de l'analyse d'un fichier xml avec un xmlns?
-
19-09-2019 - |
Question
Je suis en train d'analyser un fichier xml:
<?xml version="1.0" encoding="utf-8" ?>
<Root>
<att1 name="bob" age="unspecified" xmlns="http://foo.co.uk/nan">
</att1>
</Root>
En utilisant le code suivant:
XElement xDoc= XElement.Load(filename);
var query = from c in xDoc.Descendants("att1").Attributes() select c;
foreach (XAttribute a in query)
{
Console.WriteLine("{0}, {1}",a.Name,a.Value);
}
Rien est écrit à la console, sauf si je supprime xmlns = « http://foo.co.uk/nan » du fichier xml, après quoi, je reçois une liste de noms d'attributs et des valeurs comme l'on peut attendre, et comme je l'ai besoin!
Modifier. Mise en forme
La solution
Vous devez utiliser le même espace de noms dans votre code:
XElement xDoc= XElement.Load(filename);
XNamespace ns = "http://foo.co.uk/nan";
var query = from c in xDoc.Descendants(ns + "att1").Attributes() select c;
foreach (XAttribute a in query)
{
Console.WriteLine("{0}, {1}",a.Name,a.Value);
}
Les attributs ne ramassent pas la valeur par défaut espace de noms (de xmlns=....
), de sorte que vous n'avez pas besoin de les qualifier. La balise d'espace de noms (de xmln:tags=....
) est purement locale au document ou à l'utilisation API, les noms sont vraiment namespace + nom local toujours, donc vous devez toujours spécifier l'espace de noms.
Autres conseils
Votre appel est Interrogation pour un élément nommé " att1" dans aucun espace de noms.
Si vous avez appelé Descendants("{http://foo.co.uk/nan}att1")
vous sélectionnez l'élément mais pas l'espace de nommage élément sans espaces de noms.
Vous pouvez sélectionner des éléments nommés « att1 » dans un ou aucun espace de noms comme ceci:
var query = from c in xDoc.Descendants() where c.Name.LocalName == "att1" select c.Attributes;
Vous devez spécifier l'espace de noms dans l'appel Descendants
, comme ceci:
XNamespace ns = "http://foo.co.uk/nan";
foreach (XAttribute a in xDoc.Descendants(ns + "att1"))
{
Console.WriteLine("{0}, {1}",a.Name,a.Value);
}