2012-06-04 3 views
1

다음과 같은 형식의 XML 노드가 있습니다. 이 노드는 각 노드가 MyClass에Xnode를 Linq로 효율적으로 처리합니다.

class MyClass 
{ 
    public string tag1Id {get;set;} 
    public int tag3Val {get;set;} 
    public string tag3Id {get;set;} 
    public int tag5Val {get;set;} 
    public string tag5Id {get;set;} 
    public DataTime tag7Val {get;set;} 

} 

    <tag1 id="id1"> 
    <tag2> 
     <tag3 id="id3">10</tag3> 
     <tag4> 
     <tag5 id="id5">20</tag5> 
     </tag4> 
    </tag2> 
    <tag6> 
     <tag7>2010-12-31</tag7> 
    </tag6> 
    </tag1> 

내가 LINQ에 새로운 오전이는 LINQ 사용하여 수행 할 수있는 말의 객체로 변환 있어야합니다 유형을 사용자 정의 된 변환해야합니다. 요구 사항이 xmlseralization는 사용되지 안 :( 이 시나리오는 쉽게 처리 할 수있는 다른 방법이 있습니까?

+0

이 XML의 요점은 무엇입니까? 이름은 끔찍합니다. 사용 된 xml이 레거시 코드가 아닌 경우에는 의미가 바뀌도록 변경하거나 필요한 경우 디버그/유지/향후 몇 년 동안 이해할 수 없습니다. –

답변

0

는 할 수 없습니다 없음.

는 전환으로 인해 비즈니스 로직에 어딘가가 수행해야합니다 정확한 노드 아이디/위치에서 특정 속성으로 이동하는 배관 작업

노드를 가져 와서 그에 따라 속성을 채우는 생성자를 코딩하면 Linq를 사용하여 노드 및 노드를 열거 할 수 있습니다. 다음과 같이 select를 통해 클래스 요소의 새로운 투영법을 만듭니다.

 string data = @" 
<tags> 
    <tag id=""id1""> 
    <tag2> 
     <tag3 id=""id3"">10</tag3> 
     <tag4> 
     <tag5 id=""id5"">20</tag5> 
     </tag4> 
    </tag2> 
    <tag6> 
     <tag7>2010-12-31</tag7> 
    </tag6> 
    </tag> 
</tags> 
    "; 
var xml = XDocument.Parse(data); 

    var classes = xml.Descendants("tag1") 
        .Select(nd => new MyClass(nd));