2009-08-18 45 views
5

Có ai biết làm thế nào tôi sẽ nhận được một cá thể DOM (cây) của một tệp XML bằng Python. Tôi đang cố gắng so sánh hai tài liệu XML với nhau mà có thể có các phần tử và các thuộc tính theo thứ tự khác nhau. Làm thế nào tôi sẽ làm điều này?Lấy cây DOM của tài liệu XML

Trả lời

2

Cá nhân, bất cứ khi nào có thể, tôi bắt đầu với elementtree (tốt nhất là triển khai C đi kèm với thư viện chuẩn của Python hoặc triển khai lxml, nhưng đó là điều quan trọng chỉ là tốc độ cao hơn). Nó không phải là một DOM tuân thủ tiêu chuẩn, nhưng giữ cùng một thông tin theo cách Pythonic và handier hơn. Bạn có thể bắt đầu bằng cách gọi xml.etree.ElementTree.parse, lấy nguồn XML và trả về một phần tử-tree; làm điều đó trên cả hai nguồn, sử dụng getroot trên mỗi cây phần tử để lấy phần tử gốc của nó, sau đó đệ quy so sánh các phần tử bắt đầu từ phần tử gốc.

Trẻ em của một phần tử tạo thành một chuỗi, trong cây phần tử giống như trong DOM chuẩn, có nghĩa là thứ tự của chúng được coi là quan trọng; nhưng thật dễ dàng để làm cho Python đặt ra khỏi chúng (hoặc với nỗ lực nhiều hơn một chút "multi-sets" của một số loại, nếu lặp lại là quan trọng trong trường hợp sử dụng của bạn mặc dù thứ tự là không) cho một so sánh laxer. Nó thậm chí còn dễ dàng hơn cho các thuộc tính cho một phần tử đã cho, trong đó tính duy nhất được đảm bảo và trật tự ngữ nghĩa không liên quan. Có một số lý do cụ thể mà bạn cần một DOM chuẩn thay vì một container thay thế như một cây phần tử hay bạn chỉ sử dụng thuật ngữ DOM theo nghĩa chung để cây phần tử có thể được chấp nhận không? Không.

Trong quá khứ tôi cũng đã có kết quả tốt bằng cách sử dụng PyRXP, sử dụng đại diện thậm chí còn rõ ràng và đơn giản hơn ElementTree. Tuy nhiên, nó đã được WS và năm trước; Tôi không có kinh nghiệm gần đây như thế nào PyRXP ngày nay so sánh với lxml hoặc cElementTree.

1

Một số giải pháp để cân nhắc:

+0

Tôi đã xem minidom và không có bất kỳ thông tin nào trong tài liệu về cách lấy cây DOM từ tệp được phân tích cú pháp. Tôi muốn so sánh hai cây để trật tự không quan trọng. Bạn có bất kỳ ý tưởng làm thế nào để làm điều này? – Dave

+0

Tài liệu hướng dẫn minidom trong Python 2.6 đưa ra một ví dụ về việc nhận được một tệp DOM từ một tệp (bạn có phải sau một cái gì đó khác) không. từ xml.dom.parseom nhập parse, parseString dom1 = phân tích cú pháp ('c: \\ temp \\ mydata.xml') # phân tích cú pháp tệp XML theo tên – Mark

0

Đối với trường hợp so sánh tài liệu XML, một ngây thơ so sánh của cây DOM phân tích cú pháp sẽ không làm việc. Bạn có thể sẽ cần phải thực hiện NodeComperator của riêng bạn mà đệ quy so sánh một nút và nó lấy trẻ làm nút với một số nút khác và nó lấy trẻ làm nút dựa trên các tiêu chí cụ thể của bạn như:

  • Khi là thứ tự của phần tử con quan trọng ?
  • Khi nào khoảng trống trong nội dung văn bản có ý nghĩa?
  • Có các giá trị mặc định cho một số thành phần và chúng được trình phân tích cú pháp của bạn áp dụng không?
  • có nên tổ chức tài liệu tham khảo được mở rộng để so sánh

Minidom là một điểm khởi đầu tốt để phân tích các tập tin và rất dễ dàng để sử dụng. Việc thực hiện thực tế của chức năng so sánh cho ứng dụng cụ thể của bạn tuy nhiên cần phải được thực hiện bởi bạn.

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