2011-01-29 4 views
1

LINQ를 사용하여 두 개의 XML 문서를 조인해야하며 시작할 위치가 확실하지 않습니다. 문서 1과 문서 2를 EmailAddress 노드의 값에 연결하고 문서 2의 상태 필드 값이 포함 된 최종 출력 문서를 만들어야합니다.LINQ를 사용하여 값에 XML 문서 JOIN

아무도 도와 줄 수 있습니까?

문헌 1

enter image description here

문헌 2

enter image description here

최종 문서의 첫 번째 단계는를 생성하는 것이다

enter image description here

+0

XML을 텍스트로 게시하는 것이 좋습니다. 이미지는 도움을주기 위해 코드/데이터를 재구성하는 데 시간을 낭비하게 만듭니다. –

+0

죄송합니다. xml을 게시하려고했지만 편집자가 가져 가지 않을 것입니다. – user135498

답변

0

사전을 사용하여 이메일을 상태 값에 매핑합니다. 그런 다음 첫 번째 문서에서 모든 이메일 주소 요소를 선택하고 사전을 기반으로 속성을 설정하십시오.

var dict = secondDoc.Descendants("EmailAddress") 
        .ToDictionary(e => e.Value, e => e.Attribute("status").Value); 

var emails = firstDoc.Descendants() 
        .Where(e => e.Name.LocalName.StartsWith("EmailAddress") 
         && Char.IsDigit(e.Name.LocalName[e.Name.LocalName.Length - 1])); 

foreach (var email in emails) 
{ 
    string attribute; 
    if (dict.TryGetValue(email.Value, out attribute)) 
    { 
     email.SetAttributeValue("status", attribute); 
    } 
} 

이 방법은 직접 firstDoc을 업데이트합니다; 새로운 XElement 또는 XDocument을 생성하지 않습니다. 숫자가 끝나지 않는 EmailAddress 필드가 잘못 일치하는 것을 피하기 위해 Char.IsDigit 체크를 추가했습니다. 당신이 확신 할 수없는 경우에는 그때 당신은 쿼리에서 그 수표를 제거 할 수 있습니다.

+0

좋은 직장! 매우 능변적이고 완벽하게 작동했습니다. 고맙습니다. – user135498

+0

@ user135498 great :)'Last '가 전체 문자열을 반복 할 것이므로'IsDigit' 체크를 약간 업데이트하여 문자열 인덱스와 길이를 통해 마지막 문자에 접근합니다. –