2010-08-04 25 views
9

Tôi đang tạo một add-on cho firefox và nó tải một trang html sử dụng ajax (add-on có bảng XUL của nó).Tốc độ nào nhanh hơn, XPath hoặc Regexp?

Bây giờ tại thời điểm này, tôi không tìm kiếm cách tạo đối tượng document và đặt nội dung yêu cầu ajax vào đó và sau đó sử dụng xPath để tìm những thứ tôi cần.
Thay vào đó, tôi đang tải nội dung và phân tích nội dung dưới dạng văn bản có thông số xuất hiện thường xuyên.

Nhưng tôi có một câu hỏi. Mà sẽ là tốt hơn để sử dụng, xPath hoặc biểu thức chính quy? Đó là nhanh hơn để thực hiện?

Trang HTML sẽ bao gồm hàng trăm phần tử có chứa cùng một văn bản và những gì tôi muốn làm là đếm số lượng phần tử ở đó.

Tôi muốn tiện ích của mình hoạt động nhanh nhất có thể và tôi không biết cơ chế đằng sau regexp hoặc xPath, vì vậy tôi không biết cái nào hiệu quả hơn.

Hy vọng tôi đã rõ ràng. Cảm ơn

+6

Liên kết bắt buộc: [** Không sử dụng regex **] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – Amarghosh

+0

Cả hai đều nhanh hơn cái kia - tất cả đều phụ thuộc vào việc triển khai của chúng. –

+0

Chỉ cần tự hỏi, tại sao một số người coi đây là "không phải là một câu hỏi thực sự"? Yêu cầu loại phương pháp nào là tốt nhất (hoặc nhanh nhất) cho một tác vụ lập trình điển hình có vẻ như với tôi giống như một câu hỏi chính hãng để hỏi tại SO (imo). – Abel

Trả lời

17

Bất cứ khi nào bạn đang xử lý XML, hãy sử dụng XPath (hoặc XSLT, XQuery, SAX, DOM hoặc bất kỳ phương pháp nhận thức XML nào khác để đi qua dữ liệu của bạn). Do never use regular expressions for this task.

Tại sao? Việc xử lý XML phức tạp và xử lý mọi thứ kỳ quặc của nó, các thực thể bên ngoài/phân tích/chưa được phân tích, DTD, các hướng dẫn xử lý, xử lý khoảng trắng, thu hẹp, chuẩn hóa unicode, các phần CDATA, vv làm cho nó rất khó khăn để tạo ra một cách đáng tin cậy. dữ liệu. Chỉ cần xem xét rằng đã mất nhiều năm công nghiệp để tìm hiểu cách phân tích cú pháp XML tốt nhất, nên là đủ lý do không cố gắng thực hiện điều này một mình.

Trả lời q: khi nói đến tốc độ (nên không phải là là mối quan tâm chính của bạn ở đây), nó phụ thuộc rất nhiều vào việc triển khai trình biên dịch/bộ xử lý XPath hoặc Regex. Đôi khi, XPath sẽ nhanh hơn (tức là, khi sử dụng các khóa, nếu có thể, hoặc XSLT đã biên dịch), các thời điểm khác, các regex sẽ nhanh hơn (nếu bạn có thể sử dụng một regex được biên dịch trước và truy vấn của bạn dễ dàng). Nhưng các quy tắc không bao giờ dễ dàng với HTML/XML đơn giản chỉ vì các vấn đề về dấu ngoặc đơn (thẻ) lồng nhau, không thể được giải quyết một cách đáng tin cậy chỉ với các regex.

Nếu đầu vào lớn, regex sẽ có xu hướng nhanh hơn, trừ khi việc triển khai XPath có thể thực hiện xử lý trực tuyến (mà tôi tin không phải là phương thức bên trong Firefox).

Bạn đã viết:

"đó là hiệu quả hơn" *

nào mang lại cho bạn nhanh nhất để việc thực hiện đáng tin cậy và ổn định đó là tương đối nhanh chóng. Sử dụng XPath. Đó là những gì được sử dụng bên trong Firefox và các trình duyệt khác nếu bạn cần mã của bạn để chạy từ trình duyệt.

+0

Cảm ơn bạn đã trả lời. Bây giờ tôi có một câu hỏi newbie. Bạn có muốn biết cách tạo một đối tượng tài liệu HTML hoặc XML mới bên trong XUL của tiện ích Firefox không? Như document.evaluate chỉ làm việc với XML và HTML và NOT XUL. Tôi cần bằng cách nào đó đặt văn bản phản hồi AJAX vào tài liệu DOM để có thể sử dụng xPath trên đó. Tôi đã dành 40 phút để tìm kiếm điều này nhưng vẫn không tìm thấy. Tôi biết tôi có thể tải các nội dung vào một tab mới và acces nó ở đó, nhưng đó không phải là những gì tôi muốn làm. Cảm ơn. (không chắc chắn liệu tôi có phải tạo một câu hỏi mới thay vì hỏi ý kiến ​​ở đây) – user1651105

+1

@aleluja: Bạn nên hỏi lại câu hỏi mới của bạn. –

+0

câu trả lời tuyệt vời, chỉ cần thêm một điều nữa: trên thực tế, công nghệ xpath mới nhất hoạt động tốt hơn các biểu thức chính quy. –

Các vấn đề liên quan