Как мне получить доступ к данным XML в моем столбце, используя LINQ to XML? - PullRequest
0 голосов
/ 16 октября 2008

У меня есть этот 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>

Я получаю запись из этой таблицы, используя LINQ to SQL через это:

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

Это работает, я прекрасно получаю объект GeneratedArticle.

Я бы хотел просмотреть данные в поле ArticleKeywords, которое представляет собой XML. Я начал делать это:

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

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

Я не уверен на 100%, что я правильно получаю эти данные. Мне нужна помощь с правильным синтаксисом для получения значения и отображения из моего поля XML.

Ответы [ 3 ]

3 голосов
/ 21 октября 2008

Еще раз я поражен тем, что люди даже не пытаются ответить на свои вопросы, и люди все еще голосуют, когда они не работают. .Elements получит список элементов в текущем корне, который не является ключевым словом.

Также тот, который использует .Attributes ["X"] даже не компилирует, вам нужно использовать (), конечно, снова, он будет работать на каждом экземпляре "ключевых слов", а не "ключевых слов"

Вы можете использовать

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

или

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

или (при этом получаются все ключевые элементы независимо от уровня)

var keywords = from kw in ga.ArticleKeywords.Descendants("keyword")
2 голосов
/ 16 октября 2008

Вот пример кода:

Чтобы прочитать ключевые слова, нам нужно вызвать Elements (" ключевое слово ") not Elements (" keys ") , начиная с keys является корневым узлом.

// 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);
}

Вы можете получить значение атрибута, используя foo.Attribute ("bar"). Значение , но этот метод выдает исключение, если атрибут отсутствует. Безопасный способ получить значение атрибута - (строка) foo.Attribute ("bar") - это даст вам ноль , если атрибут отсутствует

0 голосов
/ 16 октября 2008

Я думаю, что-то вроде этого будет работать

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

Это даст вам IEnumerable анонимного типа, содержащий Value и свойство Display. В зависимости от того, что вы делаете, вы можете легко заменить анонимный тип конкретным типом.

...