2008-09-20 3 views
2

인사말.ASP.NET (C#)을 사용하여 여러 XML 파일을 구문 분석하고 특정 요소가있는 파일을 반환하십시오.

ASP.NET (C#)을 사용하여 특정 디렉토리에서 여러 XML 파일을 구문 분석 할 방법을 찾고 있습니다. 특정 요소의 내용을 반환 할 수 있기를 원하지만 그 전에 요소 사이에 특정 값이있는 요소를 찾아야합니다.

예 XML 파일 1 :

<file> 
    <title>Title 1</title> 
    <someContent>Content</someContent> 
    <filter>filter</filter> 
</file> 

예 XML 파일 2 :

<file> 
    <title>Title 2</title> 
    <someContent>Content</someContent> 
    <filter>filter, different filter</filter> 
</file> 

예 사례 1 :

나에게 '필터'의 필터가 모든 XML주세요.

예 사례 2 :

나에게 '제목 1'의 제목이 모든 XML주세요.

LINQ에서는 이것이 가능해야합니다. 그러나이 경우와 같이 배수가있는 경우가 아니라 XML 파일이 하나있는 경우이를 수행하는 방법에 대한 예제 만 보았습니다.

나는 서버 측에서이 작업을 캐시하여 캐시 할 수 있습니다.

모든 버전의 .NET Framework 기능을 사용할 수 있습니다.

감사합니다.

~ 제임스

답변

7

당신은 닷넷 3.5를 사용하는 경우,이 LINQ와 매우 쉽습니다 :

//get the files 
XElement xe1 = XElement.Load(string_file_path_1); 
XElement xe2 = XElement.Load(string_file_path_2); 

//Give me all XML that has a filter of 'filter'. 
var filter_elements1 = from p in xe1.Descendants("filter") select p; 
var filter_elements2 = from p in xe2.Descendants("filter") select p; 
var filter_elements = filter_elements1.Union(filter_elements2); 

//Give me all XML that has a title of 'Title 1'. 
var title1 = from p in xe1.Descendants("title") where p.Value.Equals("Title 1") select p; 
var title2 = from p in xe2.Descendants("title") where p.Value.Equals("Title 1") select p; 
var titles = title1.Union(title2); 

이 모두 속기를 기록 할 수 있으며, 총 단 4 줄에 당신에게 당신의 결과를 얻을 :

XElement xe1 = XElement.Load(string_file_path_1); 
XElement xe2 = XElement.Load(string_file_path_2); 
var _filter_elements = (from p1 in xe1.Descendants("filter") select p1).Union(from p2 in xe2.Descendants("filter") select p2); 
var _titles = (from p1 in xe1.Descendants("title") where p1.Value.Equals("Title 1") select p1).Union(from p2 in xe2.Descendants("title") where p2.Value.Equals("Title 1") select p2); 

이들은 모두 IEnumerable 목록이므로 함께 작업하기가 매우 쉽습니다.

foreach (var v in filter_elements) 
    Response.Write("value of filter element" + v.Value + "<br />"); 

LINQ 규칙!

2

이러한 파일을 반복하는 고유 한 반복기 클래스를 만들 수 있습니다.

XMLContentEnumerator : IEnumerable을 작성하십시오. ,

var xc = new XMLContentEnumerator(@"C:\dir"); 

var filesWithHello = xc.Where(x => x.title.Contains("hello")); 

나는 전체 예제를 제공 할 수있는 환경이없는 : 그 특정 디렉토리에있는 파일을 반복하고 그 내용을 분석 한 다음과 같은 일반적인 LINQ 필터링 쿼리를 만들 수있을 것이다 것 그러나 이것은 몇 가지 아이디어를 제공해야합니다.

2

여기 Framework 2.0을 사용하는 한 가지 방법이 있습니다. 간단한 문자열 테스트가 아닌 정규 표현식을 사용하여 이것을보다 명확하게 만들 수 있습니다. 더 많은 성능을 필요로하는 경우 XPath 표현식을 컴파일 해 볼 수도 있습니다.

static void Main(string[] args) 
{ 
    string[] myFiles = { @"C:\temp\XMLFile1.xml", 
         @"C:\temp\XMLFile2.xml", 
         @"C:\temp\XMLFile3.xml" }; 
    foreach (string file in myFiles) 
    { 
     System.Xml.XPath.XPathDocument myDoc = 
      new System.Xml.XPath.XPathDocument(file); 
     System.Xml.XPath.XPathNavigator myNav = 
      myDoc.CreateNavigator(); 

     if(myNav.SelectSingleNode("/file/filter[1]") != null && 
      myNav.SelectSingleNode("/file/filter[1]").InnerXml.Contains("filter")) 
      Console.WriteLine(file + " Contains 'filter'"); 

     if (myNav.SelectSingleNode("/file/title[1]") != null && 
      myNav.SelectSingleNode("/file/title[1]").InnerXml.Contains("Title 1")) 
      Console.WriteLine(file + " Contains 'Title 1'"); 
    } 

    Console.ReadLine(); 
} 
관련 문제