2016-07-22 3 views
2

에서 중복 자식 노드를 찾기 나는 다음과 같은 XML 문서를 가지고XML 문서

<xml> 
    <schedule orderno = "1"> 
      <item orderno = "1" /> 
      <item orderno = "2" /> 
      <item orderno = "3" /> 
      <item orderno = "2" /> 
    </schedule> 
    <scool orderno = "2"> 
      <item orderno = "5" /> 
      <item orderno = "6" /> 
      <item orderno = "1" /> 
      <item orderno = "4" /> 
    </scool> 
</xml> 

내가 xml 파일에 일치하지 않는 데이터가 있고 중복을 얻기 위해 XPath 식을해야합니다.

각 노드에있는 @ordnernoitem의 고유 한 값이 있어야한다는 규칙이 있습니다. 내가 232schedule2 값이 중복되어 있고 일치하지 않는 경우.

나는

XDocument.Parse(structure) 
     .Descendants("item") 
     .Attributes("orderno") 
     .GroupBy(g => g.Value) 
     .Where(g => g.Count() > 1) 

내 솔루션이 최적 인 XML의 LINQ 표현 라이브러리를 사용하여 그 그룹의 모든 노드, schedulescool 때문이다.

출력은 12이지만이 경우 1은 필요하지 않습니다.

문제를 어떻게 해결할 수 있습니까? 너무 항목의 부모에 의해

+0

왜 당신은 XPath를 더 나은 것 같아 :

XDocument.Parse(xml) .Descendants("item") .GroupBy(x => new { x.Parent.Name, orderno = x.Attribute("orderno").Value }) .Where(g => g.Count() > 1); 

업데이트은 중첩 수준에 중복 @orderno와 노드를 선택합니다 ? –

+0

? 나는 당신의 대답을 이해하지 못한다. linq 표현은 xpath와 같다. linq 함께 내 xpath 식을 구축하고 있지만식이 완료되지 않았습니다. – mimu1011

+1

아. 당신이 가진 것은 XPath가 아니며, [XPath] (https://en.wikipedia.org/wiki/XPath)는 XML 문서의 일부를 다루기위한 특정 언어입니다. LINQ to XML을 사용하고 있으므로 실제로 원하지 않는다면 XPath에 대한 참조를 제거하는 것이 좋습니다. –

답변

6

시도 그룹이 같은 :

XDocument.Parse(xml) 
     .Root 
     .XPathSelectElements("//*[@orderno]") 
     .Cast<XElement>() 
     .GroupBy(x => new { x.Parent, orderno = x.Attribute("orderno").Value }) 
     .Where(g => g.Count() > 1) 
     .Dump(); 
+0

감사합니다! 그것은 – mimu1011

+0

내가 데이터베이스에서 새로운 사건을 발견했습니다 .. 표현은 또한 일치하지 않는 부모 인 ordnerno를 알고 있습니다. (질문에 xml 파일을 편집했습니다. – mimu1011

+0

@Mo_Code 그래서 동등한 부모를 선택해야합니다. 'orderno' 너무, 오른쪽? – lorond