2013-11-26 2 views
1

에서 하나 개의 특정 노드의 값을 읽어나는이 같은 XML 파일이있는 XML

<Item> 
    <Season>01</Season> 
    <EpisodeNumber>01</EpisodeNumber> 
    <EpisodeTitle>Title</EpisodeTitle> 
</Item> 

모든 태그는이 XML 파일에서 정확히 한 시간이 존재한다. 나는 Linq를 사용하여 레이블에 에피소드 제목을 쓰고 싶다. 가장 쉬운 방법은 무엇입니까? 노드의 이름을 정확히 알고 있으며 노드가 한 번만 존재합니다. 그것은 for 루프 나 무언가없이 작동해야합니다, 그렇지 않아야합니까?

XDocument xml = XDocument.Load(xmlPath); 
string info = xml.Elements("EpisodeName").Value; 
label1.Text = info; 

하지만 요소가있는 방법 값이 없습니다 :

나는 이런 일에 대해 생각했다.

이 코드는 작동하지만 더 적은 수로이 코드를 작성할 수 있습니까?

XDocument xml = XDocument.Load(xmlPath); 
var info = xml.Descendants("EpisodeName"); 
foreach (string line in info) 
{ 
    label1.Text = line; 
} 

답변

0

리턴 값 Elements()은 더 Value 속성이없는 이유 인 시퀀스 (일련의 값)이다. 최대 하나의 값이 있음을 알고있는 경우 First() 또는 FirstOrDefault()을 사용하여 값을 선택할 수 있습니다. 다음은 "제목"값을 꺼내서 짧은 프로그램입니다 : 나는 보통 값이 XML에서 누락 가능성이있는 경우 FirstOrDefault()를 사용하는 것을 선호

static void Main() 
{ 
    // I am loading the value from a string just for example; you can do XDocument.Load instead 
    var xml = @" 
     <Item> 
      <Season>01</Season> 
      <EpisodeNumber>01</EpisodeNumber> 
      <EpisodeTitle>Title</EpisodeTitle> 
     </Item>"; 
    var xdoc = XDocument.Parse(xml); 

    // this is the statement which extracts the first EpisodeTitle xml element without iterating 
    var titleElem = xdoc.Root 
     .Elements("EpisodeTitle") 
     .FirstOrDefault(); 

    // check to makes sure the element exists before calling .Value 
    label1.Text = (titleElem == null) ? string.Empty : titleElem.Value; 
} 

는; 그렇지 않으면 First()이 예외를 throw합니다.

당신은 널 (null)을 확인하는 데 (당신이 1 라이너를 찾고) 다음 값 밖으로 선택한 후 DefaultIfEmpty()을 사용할 수 있습니다, 마음에 들지 않으면 :

label1.Text = xdoc.Root.Elements("EpisodeTitle2").Select(e => e.Value).DefaultIfEmpty().FirstOrDefault();