2008-10-16 5 views
0

Je possède ce XML dans une colonne de ma table:Comment puis-je accéder aux données XML dans ma colonne en utilisant LINQ to XML?

<keywords> 
    <keyword name="First Name" value="|FIRSTNAME|" display="Jack" /> 
    <keyword name="Last Name" value="|LASTNAME|" display="Jones" /> 
    <keyword name="City" value="|CITY|" display="Anytown" /> 
    <keyword name="State" value="|STATE|" display="MD" /> 
</keywords> 

Je reçois un dossier sur cette table à l'aide LINQ to SQL via ce:

GeneratedArticle ga = db.GeneratedArticles.Single(p => p.GeneratedArticleId == generatedArticleId); 

qui fonctionne, je reçois mon Objet GeneratedArticle très bien.

Je voudrais parcourir les données dans le champ ArticleKeywords, qui est XML. J'ai commencé à faire ceci:

var keywords = from k in ga.ArticleKeywords.Elements("Keywords") 
        select k; 

      foreach (var keyword in keywords) 
      { 
      //what goes here? 
      } 

Je ne suis pas sûr à 100% que j'obtiens ces données correctement. J'ai besoin d'aide avec la syntaxe appropriée pour obtenir la valeur et l'affichage de mon champ XML.

Répondre

2

Voici un exemple de code:

Pour lire des mots-clés que nous devons appeler éléments ("mot-clé ") pas éléments (" mots-clés") depuis mots-clés est un nœud racine .

// IEnumerable sequence with keywords data 
var keywords = from kw in ga.ArticleKeywords.Elements("keyword") 
       select new { 
        Name = (string)kw.Attribute("name"), 
        Value = (string)kw.Attribute("value"), 
        Display = (string)kw.Attribute("display") 
       }; 


foreach (var keyword in keywords) 
{ 
    var kw = "Name: " + keyword.Name + 
      " Value: " + keyword.Value + 
      " Display: " + keyword.Display; 
    Console.WriteLine(kw); 
} 

Vous pouvez obtenir une valeur d'attribut en utilisant foo.Attribute ("bar"). Valeur, mais cette méthode jetterais exception si l'attribut est manquant. moyen sûr d'obtenir la valeur d'attribut est (string) foo.Attribute (« bar ») - il vous donnera null si l'attribut est manquant

0

Je pense quelque chose comme ça fonctionnerait

var keywordData = from k in ga.ArticleKeywords.Elements("Keywords") 
        select new { Value = k.Attributes["value"].Value, 
           Display = k.Attributes["display"].Value}; 

Cela vous donne un IEnumerable d'un type anonyme contenant une valeur et une propriété d'affichage. En fonction de ce que vous faites, vous pouvez facilement remplacer le type anonyme par un type concret.

+0

k.Attributs ["quelque chose"] ne compilera pas – aku

+0

ga.ArticleKeywords.Elements ("Keywords") - ne renvoie pas les mots-clés – aku

3

Encore une fois, je suis étonné que les gens ne cherchent même pas leurs réponses et les gens votent quand ils ne travaillent pas. Les .Elements obtiendront la liste des éléments à la racine actuelle, qui n'est pas un mot-clé.

aussi celui utilisant .attributes [ « X »] ne même pas il vous compilez besoin d'utiliser() à nouveau bien sûr fonctionne sur chaque instance de « mots-clés » non « mot-clé »

Vous pouvez utiliser

var keywords = from kw in ga.ArticleKeywords.Element("keywords").Elements() 

ou

var keywords = from kw in ga.ArticleKeywords.Element("keywords").Elements("keyword") 

ou (cela obtenir tous les éléments clés peu importe le niveau)

var keywords = from kw in ga.ArticleKeywords.Descendants("keyword")