2010-11-09 4 views
9

J'ai choisi le titre ici car mon problème est que je dois obtenir les nœuds Item mentionnés dans l'exemple. J'ai le code XML suivant et j'ai des problèmes avec LINQ pour l'interroger, j'ai déjà pu analyser XML - mais j'ai été bloqué pendant des heures et j'espère que quelqu'un pourra m'aider. Voici mes données XML ci-dessous (exemple de données):Comment obtenir des éléments par nom en XML en utilisant LINQ

<a:entry xmlns:a="http://www.w3.org/2005/Atom"> 
<a:id>98765</a:id> 
<info>Data Catalogue</info> 
    <data> 
    <items> 
      <item> 
       <id>123456</id> 
       <value>Item One</value> 
      </item> 
      <item> 
       <id>654321</id> 
       <value>Item Two</value> 
      </item> 
     <items> 
    </data> 
    <items> 
     <item> 
     <id>123456</id> 
     <value>Item One</value> 
     </item> 
     <item> 
     <id>654321</id> 
     <value>Item Two</value> 
     </item> 
    <items> 
    <a:author> 
    <a:name>Catalogue</a:name> 
    </a:author> 
</a:entry> 

Je veux être en mesure d'extraire l'ID de la balise XML poste des postes, mais il y a un articles Tag avec des entrées d'article dans les données I DO NOT veux ces nœuds du tout - je veux root/items/id/id si cela a été exprimé en tant que chemin. J'ai essayé tout ce que je sais avec LINQ, donc si quelqu'un pouvait aider, des choses à noter bien que ce soit des données d'échantillons, c'est basé sur le système - le format ne peut pas être changé, ce n'est pas une solution acceptable.
Je n'arrive pas à déterminer où je vais mal - chaque expression LINQ que j'essaie ne renvoie rien, je pense que l'espace de noms est un problème et j'ai essayé de l'intégrer mais je vais en rond.
La solution doit travailler dans Silverlight et C#

J'ai essayé ce qui suit:

IEnumerable<XElement> nodes = 
element.Elements().Where(e => e.Name.LocalName == "items") 

Cependant cela me obtient tous les « éléments », y compris ceux sous « données » Je ne veux pas ceux-ci.


Si je fais ce qui suit sur mon XML je vois les noms des éléments affichés:

XElement element = XElement.Parse(data); 
foreach (XElement node in element.Elements()) 
{ 
    MessageBox.Show(node.Name.LocalName); 
} 

Cependant quand je fais cela, je ne vois pas les noms des noeuds sous les éléments du tout - je J'ai vérifié le XElement et il a le noeud et quand je publie les noms ci-dessus, "items" apparaît avec info et id!

foreach (XElement node in element.Elements("items")) 
    { 
    MessageBox.Show(node.Name.LocalName); 
    } 
+1

I figured it out - il y avait une déclaration d'espace supplémentaire qui était vide - l'ajout d'un espace de noms implicite à mon XML, en utilisant le XNamespace pour cela et l'ajouter au Nom de l'élément permet de résoudre le problème! – RoguePlanetoid

Répondre

18

En supposant element est votre <a:entry> élément:

var ids = element.Element("items") 
       .Elements("item") 
       .Select(item => item.Element("id").Value); 

Le Element et Elements méthodes ne renvoient que des enfants directs, et non pas tous les descendants, il ne retourne pas l'élément <items> qui est sous <data>

+1

Cela ne fonctionne pas, bien que je pensais que ce serait le genre de thijng que j'ai utilisé auparavant - je trouve que je ne peux pas obtenir tous les éléments de la racine du tout il y avait un noeud de valeur de la racine que je me suis arrêté dans l'exemple et je ne peux pas le lire non plus - si j'interroge les descendants il y en a là - je ne sais pas ce qui se passe. – RoguePlanetoid

+0

Cela fonctionne une fois que je prends en compte l'espace de noms comme ma propre réponse! – RoguePlanetoid

+0

Vous n'avez pas fourni cette information dans votre question ... Je l'ai essayée en utilisant l'élément '' comme racine et ça a bien fonctionné. –

6

J'ai eu une déclaration NameSpace vide dans mon XML je n'avais pas remarqué une fois que j'ai ajouté ceci dans mon code cela a fonctionné - oublié LINQ est très NameSpace ori Enté!

XNameSpace ns = "http://example.org/namespace"; 
var ids = element.Element(ns + "items") 
       .Elements("item") 
       .Select(item => item.Element("id").Value); 
+1

Avait le même problème, cela l'a résolu! –

Questions connexes