2014-11-20 3 views
0

LINQ를 배우기 시작했고 XML 문서에서 특정 ID를 검색해야합니다. 그 ID를 찾으면 그 옆에있는 요소의 문자열 값을 읽어야합니다. 동일한 레벨 (첨부 된 XML의 구조 참조).Linq to XML - ID로 XMLdocument 검색 및 그 옆에있는 요소 읽기

XElement 및 LINQ to XML을 사용하여이 코드를 이미 만들었지 만 가장 효율적인 방법이 아니며 개선 방법에 대한 의견을 듣고 싶습니다.

예. 내가 FIELD_ID (84)이있을 때 나는 "필드 이름 두 번째"를 반환 할

LINQ 쿼리 :

XNamespace ns = "http://myapp.com/"; 
XElement xe = XElement.Load(filePathToLoad); 

var xeQueryXmlOneOnly = from xItem in xe.Descendants(ns + "Item") 
      where xItem.Element(ns + "Field_ID").Value.Equals("84") 
      select new 
      { 
       fieldName = xItem.Elements(ns + "Field_Name").FirstOrDefault().Value, 
       fieldID = xItem.Elements(ns + "Field_ID").FirstOrDefault().Value 
      }; 

var resultsFound = xeQueryXmlOneOnly.FirstOrDefault(); 

단순화 된 XML 문서 :

<?xml version="1.0" encoding="utf-8"?> 
<exns:recordCollection xmlns:exns="http://myapp.com/" xmlns:ns1="urn:my-scripts" xmlns:ns2="urn:schemas-microsoft-com:xslt" xmlns:ns3="urn:XsltUtils"> 
    <exns:record> 
    <exns:Application_Name>My App</exns:Application_Name> 
    <exns:Field_Information> 
     <exns:Item> 
     <exns:Field_ID>1184</exns:Field_ID> 
     <exns:Field_Name>Field name 1</exns:Field_Name> 
     </exns:Item> 
     <exns:Item> 
     <exns:Field_ID>84</exns:Field_ID> 
     <exns:Field_Name>Field Name second</exns:Field_Name> 
     </exns:Item> 
     <exns:Item> 
     <exns:Field_ID>8426</exns:Field_ID> 
     <exns:Field_Name>Field name last</exns:Field_Name> 
     </exns:Item> 
    </exns:Field_Information> 
    </exns:record> 
</exns:recordCollection> 

실제로는 XML 문서는 훨씬 더 길 것 엄청난 수의 ID를 쿼리하는 거대한 루프에서 질의를받을 것입니다 - 그럼 여기에 관련된 질문이 있습니다 - 한꺼번에 모든 것을 얻을 수있는 방법이 있습니까 (SQL WHERE ID IN (.....)와 비슷한)?

+0

고유 한 ID입니까? 그리고 XML은 항상 형식이 잘되어 있습니까? –

답변

0

a) 성능이 문제가 될 수 있다면 LINQ 대신 XMLReader를 사용하는 것이 좋습니다.

b) 고유 ID가있는 경우 빠른 액세스를 제공하는 키로 Field_ID를 사용하여 사전의 값을 업데이트 할 수 있습니다. 사전은 XML Reader를 사용하여 신속하게 구축 할 수 있습니다.