2012-03-19 1 views
0

다양한 순서로 문서를 인쇄하려고합니다. 지금 나는 각 노드가 콜렉션의 프린트 오브젝트와 관련된 속성을 갖는 XML 오브젝트와 프린트 오브젝트의 콜렉션을 가지고있다. 이러한 특성을 기반으로 XML 문서를 정렬하여 이러한 개체를 정렬하려고합니다.XML 정렬 옵션 C# .Net

지금 나는 일련의 컬렉션을 사용 중이며, 내가 수행해야하는 정렬을 기반으로 노드를 새 컬렉션에 추가하고 있습니다. 문제는 3 ~ 4 종류가 지저분해진다는 것입니다. XML을 사용하는지 여부에 관계없이이 컬렉션의 인쇄 객체를 정렬하는 더 좋은 방법이 있어야한다고 확신합니다. 여기

내 XML 난에 정렬하고 있음이 그 일부 속성은 다음과 같습니다
  • 우편 번호는 문서에 나와
  • 이름
  • 사람이 있습니까 문서의 페이지

    • # 더 좋은 생각이야?

      덕분에,

      편집 -

      내 문서

      <xml> 
      <claim key="1" att1="wd" att2="de"/> 
      <claim key="2" att1="wd" att2="de"/> 
      <claim key="3" att1="wd" att2="de"/> 
      <claim key="4" att1="wd" att2="de"/> 
      </xml> 
      

      키 값이 인쇄 개체 모음의 자리와 관련있는 것처럼 보일 것입니다. 클레임 노드는 더 많은 자식 노드를 가질 수 있지만이 시점에서는 관련 노드라고 생각하지 않습니다. 적어도 속성을 기준으로 정렬 할 수 있기를 원하지만 최소 3 개의 속성이 있지만 추가 할 수 있습니다. 또한 이것은 다재다능해야하므로 정렬 순서를 전환해야 할 경우 재 배열하기가 다소 쉬워야합니다. 원하는 순서대로 XML을 가져온 다음 XML을 통해주기를 사용하여 키를 목록에 넣은 다음 해당 목록의 키를 사용하여 Print 개체를 인쇄합니다.

      덕분에,

    +0

    이 문서의 예를 게시 할 수 당신이 인쇄 개체에 XML 노드를 연결하는 방법, 부디? 그것은 많은 도움이 될 것입니다. – deadlyvices

    +2

    필자는 약간의 LINQ를 그룹화하고 정렬하는 것이 도움이 될 것이라고 제안 할 것이지만 XML을 통해 구체적인 예를 보여줄 수 있어야합니다. [여기에 게시물이 있습니다] (http://stackoverflow.com/questions/5013710/linq-order-by-group-by-and-order-by-each-group) 내가 무슨 말을하고 있는지 생각해 볼 수 있습니다. . –

    답변

    1

    나는 LINQPad이 예를 시도하고 당신이 요구하는지 무엇을 할 것으로 보인다.

    var root = XDocument.Parse("<xml><claim>...</claim></xml>").Element("xml"); 
    
    var query = from claim in root.Elements("claim") 
          let key = claim.Attributes("key").First().Value 
          let att1 = claim.Attributes("att1").First().Value 
          let att2 = claim.Attributes("att2").First().Value 
          orderby key, att1, att2 
          select claim; 
    

    그것은 당신의 XML에 <claim> 노드를 발견하면 정렬하고자하는 속성을 선택하고, 그 (것)들을 정렬하고 분류 <claim> 노드를 나타내는 IEnumerable<XElement> 컬렉션을 돌려줍니다. 나는 그것이 당신이 언급 한 유지 보수 요구 사항에 맞는 생각

    var query2 = from claim in root.Elements("claim") 
          let key = claim.Attributes("key").First().Value 
          let att1 = claim.Attributes("att1").First().Value 
          let att2 = claim.Attributes("att2").First().Value 
          orderby key, att1, att2 
          select new Print { 
             Property1 = key, // do type conversion if needed 
             Property2 = att1, 
             Property3 = att2 
            }; 
    

    을 - 당신 :

    당신은 다음 Print 객체를 구축하기 위해 query 결과를 사용할 수 있습니다, 또는 당신은 당신을 위해 그것을 가지고 위의 내용을 변경할 수 있습니다 다르게 정렬해야하는 경우 LINQ 쿼리의 특성 이름을 추가/제거/변경해야합니다.

    편집 : 아래에 귀하의 의견에 따라, int의 목록에 키를 얻으려면 :

    var printKeys = (from claim in query 
           select Integer.Parse(claim.Attributes("key").First().Value)).ToList(); 
    
    +0

    이것은 내가 필요로하는 것에 대해 효과가있는 것처럼 보입니다. 단, C#에 다소 익숙하기 때문에 IEnumerable 컬렉션을 통해 어떻게 루프 할 수 있습니까? 그래서 int 값의 목록에 Key 값을 넣을 수 있습니다. 나는 열쇠로 주문하지 않을 것이고, 열쇠는 단지 print obj 콜렉션의 어떤 지점을 인쇄할지 알아낼 수있게 해줄 것이다. – kds6253

    +0

    @ kds6253 : 답변을 업데이트했습니다. –

    +0

    고마워, 지금은 그걸로 노력하고있어. XDocument와 사용 된 solutuon에 대한 추천 된 독서물이 있습니까? 더 자세히 읽고 싶습니다.이 솔루션은 100 배 더 간단합니다. 그런 다음 처음에는이 솔루션을 사용할 수있는 곳을 배우고 싶습니다. – kds6253