2012-10-17 45 views
6

Tôi biết, tôi biết điều này đã được thực hiện cho đến chết; Tôi chỉ đăng câu hỏi để xem giải pháp này vẫn còn có liên quan kể từ bây giờ chúng ta có .NET 4 và mới hơnC# và đọc tập tin XML lớn

This link giải thích một cách đơn giản để đọc các tệp XML lớn và triển khai LINQ. Tôi khá thích điều này và chỉ muốn một câu trả lời đơn giản/s để nhà nước nếu điều này vẫn còn có liên quan hoặc có triển khai tốt hơn trong mã .NET mới hơn.

+0

Như bạn thấy trong trang web bạn đã liên kết, nó được đề cập * LINQ to XML *, mà tôi nghĩ là một trong những cách dễ nhất và nhanh nhất (về viết mã) để đọc và ghi tài liệu xml. Infact LINQ được thực hiện trong * C# 3.0 * và nó là một cách mạnh mẽ để viết truy vấn qua các bộ sưu tập và nguồn dữ liệu. –

+2

@Fuex Sử dụng LINQ to XML ra khỏi hộp sẽ tải toàn bộ tài liệu vào bộ nhớ, do đó, mặc dù nó rất dễ dàng để * viết * truy vấn mã, nó không làm cho hiệu suất nhanh hơn. Ví dụ liên quan đến tuy nhiên, sử dụng 'XmlReader' kết hợp với LINQ vì vậy nên làm việc khá tốt. – James

+0

@ James Có, tôi đồng ý với bạn. Tải toàn bộ dữ liệu vào bộ nhớ sẽ trở thành một vấn đề khi giao dịch với các tệp lớn và sẽ điều kiện hiệu suất của các truy vấn. Vì vậy, sử dụng 'XmlReader' kết hợp với * LINQ * là một ý tưởng hay. –

Trả lời

5

Câu trả lời cho câu hỏi này không thay đổi trong .NET 4 - để có hiệu suất tốt nhất, bạn vẫn nên sử dụng XmlReader vì nó suối tài liệu thay vì tải toàn bộ nội dung vào bộ nhớ.

Mã bạn tham chiếu đến sử dụng XmlReader để truy vấn thực tế vì vậy sẽ nhanh chóng hợp lý trên tài liệu lớn.

1

Cách tốt nhất để thực hiện việc này là đọc từng dòng một bằng cách sử dụng XmlReader.Create.

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

Không phải là 'XmlTextReader' không được chấp nhận? – user1096188

+1

tài liệu được liên kết không nói không được chấp nhận ở bất kỳ đâu nên tôi đoán không ... – Chris

+0

@ user1096188 Cảm ơn bạn đã chỉ ra, tôi đã cập nhật mã để sử dụng 'XmlReader.Create'. – Ekk

4

Nếu nó có vẻ như thế này:

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

bạn có thể đọc tập tin với XmlReader và mỗi 'mục' mở ra với XmlDocument như thế này:

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(); 

Trong trường hợp này, bạn có không có giới hạn về kích thước tệp.

+0

Đề xuất rất tốt! – Haukman

+0

Mã này sai. Nó đọc mục đầu tiên, sau đó thứ ba, vv – GreenGood

+0

@GreenGood, Không chính xác! Tôi đã thử nghiệm mã này nhiều lần và nó hoạt động đúng. 'reader.ReadToDescendant ("mục");' tìm kiếm phần tử đầu tiên, 'reader.ReadOuterXml()' đọc phần tử hiện tại và 'reader.ReadToNextSibling ("item")' đi đến phần tử tiếp theo. –

0

Tôi đã vật lộn với cùng một vấn đề trong vài ngày qua. Tôi chỉ nhấn chuột phải trên tính của dự án sau đó chuyển đến Build tab và chọn tùy chọn Bất kỳ CPU, đánh dấu bỏ chọn tùy chọn thích 32 Bit và lưu nó trước khi chạy ứng dụng của bạn, nó giúp tôi. Tôi đã đính kèm ảnh chụp của cùng một. enter image description here