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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top