Đầu tiên, tôi sẽ loại bỏ System.Xml.XmlDocument vì it is a DOM yêu cầu phân tích cú pháp và xây dựng toàn bộ cây trong bộ nhớ trước khi có thể nối thêm. Điều này có nghĩa là 10 MB văn bản của bạn sẽ có dung lượng hơn 10 MB. Điều này có nghĩa nó là "bộ nhớ chuyên sâu" và "tốn thời gian".
Thứ hai, tôi sẽ loại System.Xml.XmlReader vì nó requires parsing the entire file trước khi bạn có thể đến điểm khi bạn có thể nối thêm vào. Bạn sẽ phải sao chép XmlReader vào XmlWriter vì bạn không thể sửa đổi nó. Điều này đòi hỏi phải sao chép XML của bạn trong bộ nhớ đầu tiên trước khi bạn có thể thêm vào nó.
Giải pháp nhanh hơn để XmlDocument và XmlReader sẽ là chuỗi thao tác (trong đó có các vấn đề bộ nhớ riêng của mình):
string xml = @"<Errors><error />...<error /></Errors>";
int idx = xml.LastIndexOf("</Errors>");
xml = xml.Substring(0, idx) + "<error>new error</error></Errors>";
Chop tắt thẻ kết thúc, thêm vào các lỗi mới, và thêm thẻ back-end.
Tôi cho rằng bạn có thể phát điên với điều này và cắt bớt tệp của bạn theo 9 ký tự và thêm vào đó. Sẽ không phải đọc trong các tập tin và sẽ cho phép hệ điều hành tối ưu hóa tải trang (chỉ sẽ phải tải trong khối cuối cùng hoặc một cái gì đó).
System.IO.FileStream fs = System.IO.File.Open("log.xml", System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite);
fs.Seek(-("</Errors>".Length), System.IO.SeekOrigin.End);
fs.Write("<error>new error</error></Errors>");
fs.Close();
Điều đó sẽ trúng một vấn đề nếu tập tin của bạn là trống hoặc chỉ chứa "< lỗi > </lỗi >", cả hai đều có thể dễ dàng được xử lý bằng cách kiểm tra độ dài.
Nguồn
2009-05-11 17:08:02
Bạn đang viết thế nào? Sử dụng DOM? SAX? Viết trực tiếp? :-P Cá nhân tôi thích cách tiếp cận DOM hơn; bạn chỉ cần truy cập nút Errors và gọi appendChild(). –
Vui lòng xác định "nhanh nhất" cho tình huống này; bạn có nghĩa là "nhanh nhất để thực hiện" hoặc "nhanh nhất để phát triển"? –
"nhanh nhất để thực hiện" –