2010-04-30 2 views
1

2 xml 문서의 "diff"를 얻고 다른 요소 목록으로 끝내려고합니다. 아래 XML은 누구나 도움을 줄 수 있는지 궁금합니다. 아래의 경우 목록에 "file2.xml"요소와 "file3.xml"요소가 들어 있기를 원합니다. 첫 번째 XML 문서와 다르거 나 새로운 요소이기 때문입니다.LINQ to XML 쿼리 도움말

미리 감사드립니다.

<?xml version="1.0" encoding="utf-8" ?> 
<versioninfo> 
    <files> 
    <file version="1.0">file1.xml</file> 
    <file version="1.0">file2.xml</file> 
    </files> 
</versioninfo> 


<?xml version="1.0" encoding="utf-8" ?> 
<versioninfo> 
    <files> 
    <file version="1.0">file1.xml</file> 
    <file version="1.1">file2.xml</file> 
    <file version="1.0">file3.xml</file> 
    </files> 
</versioninfo> 

답변

1

나는 무엇을 당신이하려는 것은 다른 버전이있는 모든 파일 이름의 목록을 얻을 것으로을 생각 . 그렇다면 다음과 같이하십시오.

XDocument first = (...); 
XDocument second = (...); 

var firstFiles = first.Element("versioninfo").Element("files").Elements("file"); 
var secondFiles = second.Element("versioninfo").Element("files").Elements("file"); 

var changedFileNames = 
    from f1 in firstFiles 
    join f2 in secondFiles 
     on f2.Value equals f1.Value 
    where f1.Attribute("version").Value != f2.Attribute("version").Value 
    select f1.Value; 

var firstFileNames = firstFiles.Select(f => f.Value); 
var secondFileNames = secondFiles.Select(f => f.Value); 
var addedFileNames = firstFileNames.Except(secondFileNames); 
var removedFileNames = secondFileNames.Except(firstFileNames); 

var allChanges = changedFileNames 
    .Concat(addedFileNames) 
    .Concat(removedFileNames); 
+0

하나의 목록에는 있지만 다른 하나에는없는 목록도 있으므로 해결책은 절반입니다. –

+0

좋은 점은 질문을 더주의 깊게 읽어야합니다. 추가/삭제 된 파일을 포함하도록 업데이트했습니다. – Aaronaught

+0

원래 목록에서 "arent"인 부분이 절반 밖에 없습니다. –