2010-10-06 6 views
0

Je suis en train d'écrire une application Windows Phone 7 qui lit à partir d'un xml en utilisant xdocument mais j'ai quelques problèmes.J'essaie de travailler avec xml linq xdocument dans vb.net

Si je fais ceci:

Dim xml As XDocument = XDocument.Load(e.Result) 
System.Diagnostics.Debug.WriteLine(xml.ToString) 

Ou ceci:

System.Diagnostics.Debug.WriteLine(xml.Elements.Value.ToString) 

alors les données XML est sortie à la fenêtre immidiate comme une chaîne prouvant que les données existent, mais si je fais ceci:

Dim products = From product In xml.Descendants("product") _ 
        Select title = product.Element("title").Value 

For Each product In products 
    System.Diagnostics.Debug.WriteLine("Title" & product.title) 
Next 

je reçois rien pour product.title et je reçois aussi rien quand je fais des trucs comme ça:

Dim count As Integer = xml.Descendants("count").Value 

Qu'est-ce que je fais mal? Merci.

xml ressemble à ceci:

<productslist> 
    <count>2</count> 
    <products> 
    <product> 
     <productId>1</productId> 
     <title>test item 1 </title> 
     <price>4.99</price> 
     <category> 
      <categoryId>1</categoryId> 
      <categoryName>cat 1</categoryName> 
     </category> 
    </product> 
    <product> 
     <productId>2</productId> 
     <title>test item 2</title> 
     <price>10.99</price> 
     <category> 
      <categoryId>2</categoryId> 
      <categoryName>cat 2</categoryName> 
     </category> 
    </product> 
</productslist> 
+0

Il est difficile de savoir ce que vous faites mal lorsque nous ne savons pas à quoi ressemble le document. Pourriez-vous modifier votre question pour l'inclure? –

Répondre

1

Votre déclaration LINQ n'est pas pénétrant dans un type anonyme avec une propriété de Title. Vous obtenez directement un IEnumerable<string>.

Essayez ceci:

Dim products = From product In xml.Descendants("product") _ 
       Select product.Element("title").Value 

For Each product In products 
    Debug.WriteLine("Title: " & product) 
Next 

Cela dit, la products variable est mieux nommé titles. Si vous voulez projeter dans un type anonyme, vous devez utiliser With New { .Prop1 = data, .Prop2 = other }. Un point doit être préfixé à chaque nom de propriété. Voici un exemple:

Dim products = From product In xml.Descendants("product") _ 
       Select New With { .Title = product.Element("title").Value } 

For Each product In products 
    Debug.WriteLine("Title: " & product.Title) 
Next 

Pour votre exemple, il ne semble pas qu'un type anonyme soit nécessaire. Si vous avez plusieurs propriétés à projeter, cela en vaut la peine.

EDIT: en réponse à votre commentaire, un espace de noms pourrait être attaché à votre XML. Si c'est le cas, vous devrez le référencer pour référencer n'importe quel élément.

Si votre XML a un espace de noms, il doit avoir un xmlns spécifié, tels que:

<productslist xmlns="http://domain.com/namespace"> 

Vous devrez alors modifier votre code pour obtenir l'espace de noms et concaténer avec vos éléments comme suit:

Dim ns = xml.Root.GetDefaultNamespace() 

Dim products = From product In xml.Descendants(ns + "product") _ 
       Select product.Element(ns + "title").Value 
+0

Merci pour la réponse mais je n'ai toujours rien. J'ai vérifié products.Count et il renvoie 0 donc le pour chaque instruction ne tire même pas –

+0

@JasperS c'est impair. Pouvez-vous définir un point d'arrêt et inspecter 'xml.Descendants ("product") 'pour s'assurer que ces nœuds sont retournés? Est-ce que votre XML utilise un espace de nommage et n'apparaît pas exactement comme vous l'avez montré ci-dessus? Les espaces de noms doivent être préfixés aux noms d'éléments. –

+0

Je ne comprends pas ce que vous voulez dire par espace de noms en XML, je n'ai pas beaucoup travaillé avec xml. Que voulez-vous dire par préfixe aux noms d'éléments? –

0

Désolé, je ne sais pas VB Mais en C# ce code faire-

var query = doc.Descendants("product").Select(x => new {Title= x.Element("title").Value}); 

      foreach (var item in query) 
      { 
       Console.WriteLine(item.Title); 

      } 

De plus, le code XML que vous avez publié est manquant </products>. noeud (balise de fin), j'espère que c'est juste une erreur de copier coller.