Nếu hiệu suất là yếu tố quan trọng và/hoặc kích thước tài liệu lớn (cả hai trường hợp này ở đây), sự khác biệt giữa trình phân tích cú pháp sự kiện (như SAX hoặc StAX) và thực thi Java XPath gốc rằng sau này xây dựng một Tài liệu DOM W3C trước khi đánh giá biểu thức XPath. [Thật thú vị khi lưu ý rằng tất cả các triển khai của Mô hình đối tượng tài liệu Java như DOM hoặc Axiom đều sử dụng bộ xử lý sự kiện (như SAX hoặc StAX) để xây dựng biểu diễn trong bộ nhớ, vì vậy nếu bạn có thể nhận được chỉ với bộ xử lý sự kiện bạn tiết kiệm cả bộ nhớ và thời gian cần thiết để tạo DOM.]
Như tôi đã đề cập, việc triển khai XPath trong JDK hoạt động trên Tài liệu DOM W3C. Bạn có thể thấy điều này trong Java JDK mã nguồn thực hiện bằng cách nhìn vào com.sun.org.apache.xpath.internal.jaxp.XPathImpl
, nơi trước khi đánh giá() phương pháp được gọi là phân tích cú pháp trước tiên phải phân tích các nguồn:
Document document = getParser().parse(source);
Sau này 10GB của bạn của XML sẽ được đại diện trong bộ nhớ (cộng với bất kỳ chi phí nào) — có lẽ không phải là thứ bạn muốn. Mặc dù bạn có thể muốn có một giải pháp "chung" hơn, cả XPath và XML đánh dấu của bạn dường như tương đối đơn giản, vì vậy dường như không phải là sự biện minh thực sự cho XPath (ngoại trừ có lẽ là sang trọng lập trình). Điều tương tự cũng đúng đối với gợi ý XProc: điều này cũng sẽ xây dựng một DOM. Nếu bạn thực sự cần một DOM, bạn có thể sử dụng Axiom thay vì DOM W3C. Axiom có một API thân thiện hơn nhiều và xây dựng DOM của nó trên StAX, vì vậy nó nhanh và sử dụng Jaxen để thực thi XPath của nó. Jaxen yêu cầu một số loại loại DOM (W3C DOM, DOM4J hoặc JDOM). Điều này sẽ đúng với tất cả các cài đặt XPath, vì vậy nếu bạn không thực sự cần XPath gắn bó với chỉ trình phân tích sự kiện sẽ được đề nghị.
SAX là API phát trực tuyến cũ, với StAX mới hơn và nhanh hơn rất nhiều. Hoặc sử dụng triển khai thực hiện JDK StAX gốc (javax.xml.stream
) hoặc thực hiện STAX Woodstox (nhanh hơn đáng kể theo kinh nghiệm của tôi), tôi khuyên bạn nên tạo bộ lọc sự kiện XML khớp với tên loại phần tử đầu tiên (để chụp các phần tử <txn>
). Điều này sẽ tạo ra các sự kiện nhỏ (phần tử, thuộc tính, văn bản) có thể được kiểm tra cho các giá trị người dùng phù hợp của bạn. Khi một trận đấu phù hợp, bạn có thể kéo thông tin cần thiết từ các sự kiện hoặc đường ống các sự kiện bị chặn để xây dựng một mini-DOM từ chúng nếu bạn thấy kết quả dễ điều hướng hơn. Nhưng có vẻ như điều đó có thể quá mức nếu đánh dấu đơn giản.
Đây có thể là cách tiếp cận đơn giản nhất, nhanh nhất có thể và tránh được phí trên bộ nhớ của việc xây dựng một DOM. Nếu bạn đã chuyển tên của phần tử và thuộc tính cho bộ lọc (để thuật toán khớp của bạn có thể cấu hình được), bạn có thể làm cho nó tương đối chung chung.
Nguồn
2013-04-03 10:26:53
Tôi đề nghị là sử dụng mở rộng VTD-xml trong chế độ bản đồ mem và 64 bit jvm –