LINQ에서 XML을 사용하여 열의 XML 데이터에 어떻게 액세스합니까?
-
03-07-2019 - |
문제
이 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에서 SQL을 사용하여 그 테이블에서 레코드를 얻고 있습니다.
GeneratedArticle ga = db.GeneratedArticles.Single(p => p.GeneratedArticleId == generatedArticleId);
그게 작동합니다. 생성 된 부분 객체를 잘게 만듭니다.
XML 인 ArticleKeywords 필드의 데이터를 걸어 가고 싶습니다. 나는 이것을하기 시작했다 :
var keywords = from k in ga.ArticleKeywords.Elements("Keywords")
select k;
foreach (var keyword in keywords)
{
//what goes here?
}
나는 그 데이터를 올바르게 받고 있다고 100% 확신하지 못한다. XML 필드에서 값을 얻고 표시하려면 적절한 구문에 대한 도움이 필요합니다.
해결책
다음은 샘플 코드입니다.
키워드를 읽으려면 전화해야합니다 집단("예어") ~ 아니다 집단("키워드") ~부터 키워드 루트 노드입니다.
// 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") - 그것은 당신에게 줄 것입니다 없는 속성이 누락 된 경우
다른 팁
다시 한 번 나는 사람들이 답을 시도하지 않고 사람들이 일하지 않을 때 여전히 투표를한다는 것에 놀랐습니다. .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")
나는 이런 것이 효과가 있다고 생각할 것입니다
var keywordData = from k in ga.ArticleKeywords.Elements("Keywords")
select new { Value = k.Attributes["value"].Value,
Display = k.Attributes["display"].Value};
이것은 당신에게 값과 디스플레이 속성을 포함하는 익명 유형의 ienumerable을 제공합니다. 당신의 행동에 따라 익명 유형을 콘크리트 유형으로 쉽게 교체 할 수 있습니다.