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

Était-ce utile?

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top