2010-08-18 1 views
0

asp.net 모바일 응용 프로그램을 개발 중입니다. XML을 데이터베이스로 사용하고 있습니다. 필요한 출력에 대해 다음 쿼리를 사용하고 있습니다. XML 파일에는 MIMICS 노드 컬렉션이 있습니다. & MIMICS 노드 안에 SECTION 노드 컬렉션이 있습니다. 하나 이상의 더 제 노드는 내가 XML 쿼리 다음 사용하고 위의 XML 파일의 경우LINQ to XML에서 descendants() 대신 사용할 메서드는 무엇입니까?

<MIMIC ID="3" NAME="Network Status"> 
       <SECTIONS> 
        <SECTION ID="1" NAME="SDA Server 1" HAS-SUBSECTIONS="TRUE"> 
      <DATAITEM NAME="ABC">XYZ</DATAITEM> 
         <SECTION ID="2" NAME="Top Side"> 
          <DATAITEMS> 
           <DATAITEM>Not Available</DATAITEM> 
          </DATAITEMS> 
         </SECTION> 
         <SECTION ID="3" NAME="Subsea" HAS-SUBSECTIONS="TRUE"> 
          <SECTION ID="4" NAME="SDA"> 
           <DATAITEMS> 
            <DATAITEM NAME="SEMA"> 
             <ATTRIBUTE NAME="TYPE" VALUE="?" APPEND-TAG-NAME-BY ="?"/> 
             <ATTRIBUTE NAME="TagName" VALUE="?"/> 
             <ATTRIBUTE NAME="OPCTagName" VALUE="?"/> 
            </DATAITEM> 
            <DATAITEM NAME="SEMB"> 
             <ATTRIBUTE NAME="TYPE" VALUE="?" APPEND-TAG-NAME-BY ="?"/> 
             <ATTRIBUTE NAME="TagName" VALUE="?"/> 
             <ATTRIBUTE NAME="OPCTagName" VALUE="?"/> 
            </DATAITEM> 
           </DATAITEMS> 
          </SECTION> 
          <SECTION ID="5" NAME="Manifolds" HAS-SUBSECTIONS="TRUE"> 

을 다음과 같이 내가있는 DataItem이 섹션 노드에서 하나 개 이상의 제 노드 (중첩 된 제 노드)를 포함

string MIMIC_ID = "3"; 
string SECTION_ID = "1"; 



var QueryResultSet = from Mimic in FieldRoot.Element("USER-INTERFACE-DEFINITION").Element("MIMICS").Descendants("MIMIC") 
           .Where(e => e.Attribute("ID").Value == MIMIC_ID) 
           from DataItem in Mimic.Descendants("SECTION") 
           .Where(e => e.Attribute("ID").Value == SECTION_ID) 
           .Descendants("DATAITEM") 
           select DataItem; 

위의 XML 쿼리에서 ID = 1 인 SECTION 노드에 대해서만 DATAITEM 노드에 액세스하려고합니다. 하지만 SECTION ID가 2,3,4,5 인 모든 DATAITEM 노드를 얻고 있습니다. 나는 Mimic.Descendants ("SECTION")를 사용하고 있기 때문에 그것이라고 생각합니다. Mimic.Descendants ("SECTION") 메서드를 대체 할 수있는 다른 방법이있어 ID = 1 인 SECTION 노드에 대해서만 DATAITEM 노드에 액세스 할 수 있습니까? 위의 문제를 해결할 수있는 코드 또는 링크를 제공해 줄 수 있습니까?

답변

0

위의 XML f 데이터 항목 & SECTION의 각 노드에 ID 속성을 추가해야합니다. 그때

.Descendants ("있는 DataItem") 상기 질의의 다음 부분을 다음 쿼리

var QueryResultSet = from Mimic in FieldRoot.Element("USER-INTERFACE-DEFINITION").Element("MIMICS").Descendants("MIMIC") 
            .Where(e => e.Attribute("ID").Value == MIMIC_ID) 
            from DataItem in Mimic.Descendants("SECTION") 
            .Where(e => e.Attribute("ID").Value == SECTION_ID) 
            .Descendants("DATAITEM").Where(e => 
            e.Parent.Attribute("ID").Value == SECTION_ID) 
            select DataItem; 

을 사용한다. 여기서 (E => e.Parent.Attribute ("ID"). 값 = = SECTION_ID)

은 SECTION 노드 또는 DATAITEMS 노드 일 수있는 상위 노드를 확인합니다. SECITE & DATAITEMS 노드에 해당 ID가 있어야 함을주의해야합니다. 이 두 노드에서 SECTION ID가 기본 키 역할을합니다 & DATAITEMS ID가 외래 키 역할을합니다. 따라서 DATAITEM이 SECTION 노드 아래 또는 DATAITEMS 노드 아래에 있는지 여부에 상관없이 위의 쿼리는 SECTION ID = 1 또는 지정한 SECTION ID가있는 필수 DATAITEM 노드를 모두 찾습니다.

0

입력 된 XML을 올바르게 이해한다면 위의 샘플은 SECTION ID = 1에 속하는 DATAITEM 하위를 실제로 표시하지 않습니다 (중첩 된 섹션 대신 .Descendatns ("있는 DataItem ')를 LINQ 쿼리에 다음)있는 DataItem의 자녀가 사용 :

.Element("DATAITEMS").Elements("DATAITEM") 

자손은 당신이 그것을 호출 노드의 전체 하위 트리를 안내합니다 지정된 어떤 요소를 반환합니다 이름은 섹션이 중첩되어 있으므로 중첩 된 섹션도 찾습니다.