2012-10-17 6 views
6

나는 알고있다. 나는 죽음에 이른 것을 알고있다. 임 그냥 그냥이 솔루션은 여전히 ​​관련성이 있는지 확인하기 위해 게시 이후 지금 우리는. NET 4 이상C# 및 큰 XML 파일 읽기

큰 XML 파일을 읽을 수있는 간단한 방법을 설명하고 Linq 구현합니다. 나는 이것을 아주 좋아하고 이것은 단지 여전히 관련이 있거나 최신 .NET 코드에서 구현이 더 나은지 간단하게 설명하고 싶다.

+0

링크 된 사이트에서 볼 수 있듯이 XML 문서를 읽고 쓰는 데 가장 쉽고 빠른 방법 (코드 작성 관점) 중 하나 인 LINQ to XML *이 언급되어 있습니다. Infact LINQ는 * C# 3.0 *에서 구현되었으며 컬렉션 및 데이터 소스에 대한 쿼리를 작성하는 강력한 방법입니다. –

+2

@Fuex LINQ to XML을 사용하면 전체 문서가 메모리에로드되므로 코드를 쉽게 쓸 수 있지만 성능이 향상되지 않습니다. 그러나 링크 된 예제는 LINQ와 함께'XmlReader'를 사용하므로 꽤 잘 작동합니다. – James

+0

@James 네, 동의합니다. 대용량 파일을 다룰 때 전체 데이터를 메모리에로드하는 것이 문제가되고 쿼리의 성능을 조절합니다. 따라서 * LINQ *와 함께'XmlReader'를 사용하는 것이 좋습니다. –

답변

5

이 질문에 대한 답은 .NET 4에서 변경되지 않았습니다 - 그것은 대신 메모리에 전체 일을로드하는 문서를 스트림으로 최적의 성능을 위해 여전히 XmlReader를 사용한다.

참조하는 코드는 실제 쿼리에 XmlReader을 사용하므로 큰 문서에서는 비교적 빨리 처리해야합니다.

1

이 작업을 수행하는 가장 좋은 방법은 XmlReader.Create을 사용하여 줄 단위로 읽는 것입니다.

var reader = XmlReader.Create(filename); 
reader.WhitespaceHandling = WhitespaceHandling.None; 
while (reader.Read()) 
{ 
    // your code here. 
} 
+2

'XmlTextReader'가 사용되지 않습니다. – user1096188

+1

링크 된 문서는 어디서나 deprecated라고 말하지 않으므로 나는 그렇지 않다는 것을 짐작할 수있다. – Chris

+0

@ user1096188 지적 해 주신 것에 대해 감사 드리며, 나는 'XmlReader.Create'를 사용하도록 코드를 업데이트했다. – Ekk

4

는 다음과 같이 보인다면 :

<root> 
    <item>...</item> 
    <item>...</item> 
    ... 
</root> 

당신이 XmlReader으로 파일을 읽을 수 및 각 '항목이'이 같은 XmlDocument로 엽니 다

reader.ReadToDescendant("root"); 
reader.ReadToDescendant("item"); 

do 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(reader.ReadOuterXml()); 
    XmlNode item = doc.DocumentElement; 

    // do your work with `item` 
} 
while (reader.ReadToNextSibling("item")); 

reader.Close(); 

이 경우, 당신은 파일 크기에 제한이 없습니다.

+0

아주 좋은 제안! – Haukman

+0

이 코드는 잘못되었습니다. 첫 번째 항목을 읽은 다음 세 번째 항목을 읽습니다. – GreenGood

+0

@GreenGood, Not incorrect! 이 코드를 여러 번 테스트했는데 제대로 작동합니다. 'reader.ReadToDescendant ("item");' 첫 번째 요소를 찾으면 'reader.ReadOuterXml()'은 현재 요소를 읽고 'reader.ReadToNextSibling ("item")은 다음 요소로 이동합니다. –

0

나는 지난 며칠 동안 같은 문제로 어려움을 겪고있었습니다. 난 그냥 바로 나를 도왔 32 비트을 선호하고 응용 프로그램을 실행하기 전에 저장, 프로젝트 속성 다음 빌드 탭 선택 옵션 모든 CPU를 탐색을 클릭 의 선택을 취소에게 옵션을 선택합니다. 같은 스냅 샷을 첨부했습니다. enter image description here