- Phân tích cú pháp XML AJAX/jQuery
- Sơ đồ XML với Đa kế thừa
- Tuần tự hóa Enum Json so với XML
- XML loại đơn giản, nội dung đơn giản, loại phức tạp, nội dung phức tạp
Tôi cần phân tích cú pháp một tệp xml thực chất là hình ảnh của một cấu trúc cây rất lớn, vì vậy tôi sử dụng lớp XmlReader để điền thông tin vào cây một cách "động". Mỗi nút chỉ cần truyền khối xml mà nó mong đợi từ nút cha thông qua hàm ReadSubtree(). Lợi ích của việc này là bạn không phải lo lắng khi nào một nút đã sử dụng hết tất cả các nút con của nó. Nhưng bây giờ tôi tự hỏi liệu đây có thực sự là một ý tưởng hay không, vì có thể có hàng nghìn nút và khi đọc các tệp nguồn .NET, tôi thấy rằng mỗi lệnh gọi ReadSubtree tạo ra một số đối tượng mới (có thể nhiều hơn) và không có bộ nhớ đệm các đối tượng có thể tái sử dụng (theo như tôi thấy).
Có lẽ ReadSubtree() không được sử dụng nhiều, hoặc có thể tôi chỉ đang lo lắng vô ích và tôi chỉ cần gọi GC.Collect() sau khi phân tích tệp...
Hy vọng ai đó có thể làm sáng tỏ vấn đề này.
Cảm ơn trước.
Cảm ơn câu trả lời tuyệt vời và sâu sắc của bạn.
Tôi đã nghiên cứu mã nguồn .NET và thấy nó phức tạp hơn tôi nghĩ ban đầu. Cuối cùng tôi đã từ bỏ ý định gọi hàm này trong trường hợp này. Như Stefan đã chỉ ra, trình đọc xml không bao giờ được chuyển cho bên ngoài và tôi có thể tin tưởng vào mã phân tích luồng xml (do chính tôi viết), vì vậy tôi muốn buộc mỗi nút chịu trách nhiệm về lượng dữ liệu mà chúng đánh cắp từ luồng hơn là sử dụng hàm ReadSubtree() không quá mỏng ở cuối để tiết kiệm chỉ một vài dòng mã.
1 Câu trả lời
ReadSubTree() cung cấp cho bạn một XmlReader bao bọc XmlReader gốc. Trình đọc mới này trông giống như một tài liệu hoàn chỉnh đối với người tiêu dùng. Điều này có thể quan trọng nếu mã mà bạn truyền vào cây con cho rằng nó đang nhận được một tài liệu xml độc lập. Ví dụ, thuộc tính Depth của Reader mới bắt đầu từ 0. Đây là một lớp bao bọc rất mỏng nên bạn sẽ không sử dụng thêm bất kỳ tài nguyên nào so với khi sử dụng trực tiếp XmlReader thô và trong ví dụ bạn đưa ra, có khả năng là bạn không thực sự khai thác được nhiều từ trình đọc cây con.
Trong trường hợp của bạn, lợi thế lớn nhất là trình đọc cây con sẽ không vô tình đọc một cây con khác. Vì trình đọc cây con không quá đắt nên tính an toàn này có thể đủ, mặc dù nhìn chung nó hữu ích hơn khi bạn cần cây con trông giống như tài liệu hoặc khi bạn không tin tưởng mã chỉ đọc cây con của chính nó.
Như Will đã đề cập, bạn không bao giờ muốn gọi GC.Collect(). Nó sẽ không bao giờ cải thiện được hiệu suất.
Liên quan đến .net - Lạm dụng XmlReader ReadSubtree(), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/114327/
Tôi cần phân tích cú pháp một tệp xml thực chất là hình ảnh của một cấu trúc cây rất lớn, vì vậy tôi sử dụng lớp XmlReader để điền thông tin vào cây một cách "động". Mỗi nút chỉ cần truyền XML mà nó mong đợi từ nút cha của nó thông qua hàm ReadSubtree()
Tôi có đoạn mã sau để xử lý các tệp XML, định dạng xml là: FST Đoạn mã để đọc cây con là: XmlReader reader =
Tôi đang cố xử lý một tài liệu XML lớn cùng một lúc (sử dụng XmlReader) và chỉ hủy tuần tự hóa một số phần tử nhất định của tài liệu đó bằng XmlSerializer. Đây là một số mã và một tài liệu XML giả nhỏ cho thấy cách tôi đang cố gắng thực hiện điều này
Tôi là một lập trình viên xuất sắc, rất giỏi!