Come posso accedere ai dati XML nella mia colonna usando LINQ to XML?
-
03-07-2019 - |
Domanda
Ho questo XML in una colonna nella mia tabella:
<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>
Sto ottenendo un record da quella tabella usando LINQ to SQL tramite questo:
GeneratedArticle ga = db.GeneratedArticles.Single(p => p.GeneratedArticleId == generatedArticleId);
Funziona, ottengo il mio oggetto GeneratedArticle bene.
Vorrei esaminare i dati nel campo ArticleKeywords, che è XML. Ho iniziato a fare questo:
var keywords = from k in ga.ArticleKeywords.Elements("Keywords")
select k;
foreach (var keyword in keywords)
{
//what goes here?
}
Non sono sicuro al 100% di ricevere correttamente quei dati. Ho bisogno di aiuto con la sintassi corretta per ottenere il valore e visualizzarlo dal mio campo XML.
Soluzione
Ecco un codice di esempio:
Per leggere le parole chiave dobbiamo chiamare Elementi (" parola chiave ") non Elementi (" parole chiave " ) poiché parole chiave è un nodo principale.
// 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);
}
Puoi ottenere il valore dell'attributo usando foo.Attribute (" bar "). Valore , ma questo metodo genererebbe un'eccezione se l'attributo è mancante. Il modo sicuro per ottenere il valore dell'attributo è (stringa) foo.Attribute (" bar ") - ti darà null se l'attributo manca
Altri suggerimenti
Ancora una volta sono stupito che le persone non provino nemmeno le loro risposte e le persone continuano a votare quando non lavorano. .Elements otterrà l'elenco degli elementi nella radice corrente, che non è una parola chiave.
Anche quello che usa .Attributes [" X "] non si compila nemmeno che devi usare () ovviamente di nuovo funzionerebbe su ogni istanza di " parole chiave " non " parola chiave "
Puoi usare
var keywords = from kw in ga.ArticleKeywords.Element("keywords").Elements()
o
var keywords = from kw in ga.ArticleKeywords.Element("keywords").Elements("keyword")
o (questo otterrà tutti gli elementi delle parole chiave indipendentemente dal livello)
var keywords = from kw in ga.ArticleKeywords.Descendants("keyword")
Penso che qualcosa del genere funzionerebbe
var keywordData = from k in ga.ArticleKeywords.Elements("Keywords")
select new { Value = k.Attributes["value"].Value,
Display = k.Attributes["display"].Value};
Questo ti darebbe un IEnumerable di un tipo anonimo contenente un valore e una proprietà Display. A seconda di ciò che stai facendo, potresti facilmente sostituire il tipo anonimo con un tipo concreto.