2013-01-10 38 views
5

Tôi đang cố gắng viết một tập lệnh python để chuẩn hóa các tệp XML chung, được sử dụng để định cấu hình các trang web và biểu mẫu trang web. Tuy nhiên để làm điều này tôi muốn duy trì thứ tự thuộc tính ban đầu của các phần tử, hoặc thậm chí tốt hơn có thể sắp xếp lại chúng theo một cách được xác định trước. Hiện tại hầu hết các trình phân tích cú pháp xml tôi đã thử viết lại thứ tự thuộc tính là chữ số-alpha. Vì các tệp XML này được đọc/ghi và duy trì của con người, điều này không hữu ích lắm.Thứ tự thuộc tính cài đặt Elementtree

Ví dụ: một phần tử chung có thể trông giống như thế này trong XML;

<Question QuestionRef="XXXXX" DataType="Integer" Text="Question Text" Availability="Shown" DefaultAnswer="X"> 

Tuy nhiên một lần đi ngang qua ElementTree và tái ghi vào một tập tin mới này được thay đổi thành:

<Question Availability="Shown" DataType="Integer" DefaultAnswer="X" PartType="X" QuestionRef="XXXXX" Text="Question Text"> 

Như mục đích của kịch bản được chuẩn hóa một số lượng lớn các tập tin XML để tăng khả năng đọc giữa các đồng nghiệp và thông tin chứa trong các thuộc tính của phần tử có mức độ quan trọng khác nhau (ví dụ: QuestionRef là rất quan trọng), dicates mà các thuộc tính cần phải được sắp xếp hợp lý.

Tôi hiểu rằng các băn khoăn python (các thuộc tính được lưu trữ trong) tự nhiên không có thứ tự và đặc tả XML cho biết thứ tự thuộc tính là không đáng kể, nhưng yếu tố dễ đọc của con người là động lực đằng sau kịch bản.

Trong câu hỏi khác (trên Stack Overflow) tương tự như tôi đã thấy nó pxdom có ​​thể làm điều này (câu hỏi liên kết: link), nhưng tôi không thể tìm thấy bất kỳ đề cập đến cách nó có thể làm điều này trong pxdom tài liệu hoặc sử dụng tìm kiếm trên google. Vậy có cách nào để duy trì thứ tự các thuộc tính hoặc định nghĩa nó với các trình phân tích cú pháp XML hiện tại không? Tốt hơn là không cần đến hotpatching :)!

Bất kỳ trợ giúp nào có thể cung cấp sẽ được đánh giá cao :).

+2

Mặc dù trước tiên tôi có thể sử dụng định dạng tệp khác (chẳng hạn như yaml?) để chỉnh sửa con người - và sau đó dịch thành XML nếu được yêu cầu bởi hệ thống ... –

+0

Nếu thứ tự của các thuộc tính là quan trọng, bạn có cân nhắc sử dụng các phần tử con (ví dụ: ' Shown') không? Ở đó, thứ tự chắc chắn được bảo tồn. – Constantinius

+0

Vấn đề là XML được chuyển tới mã C# tạo ra các trang web bằng HTML và javscript. Mã này đã được phát triển trong khoảng 5 năm, thay vì cồng kềnh. Do đó việc chuyển đổi từ XML là không khả thi khi di chuyển tính khả dụng sang một phần tử con. Cảm ơn sự giúp đỡ mặc dù :) –

Trả lời

5

Áp dụng miếng vá khỉ như được đề cập bên dưới ::
trong ElementTree.py tệp, có một hàm có tên là _serialize_xml;
trong chức năng này; áp dụng các bản vá được đề cập dưới đây;

 ##for k, v in sorted(items): # remove the sorted here 
     for k, v in items: 
      if isinstance(k, QName): 
       k = k.text 
      if isinstance(v, QName): 
       v = qnames[v.text] 
      else: 
       v = _escape_attrib(v, encoding) 
      write(" %s=\"%s\"" % (qnames[k], v)) 

tại đây; loại bỏ các sorted(items) và làm cho nó chỉ items như tôi đã làm ở trên.

Cũng để tắt phân loại dựa trên không gian tên (vì trong bản vá ở trên; phân loại vẫn còn hiện diện khi không gian tên có mặt cho thuộc tính xml; nếu không có không gian tên; như vậy để làm điều đó, thay thế tất cả {} với collections.OrderedDict() từ ElementTree.py

Bây giờ bạn có tất cả các thuộc tính trong một trật tự như bạn đã thêm họ vào đó yếu tố xml.

Trước khi thực hiện tất cả các bước trên; đọc thông báo bản quyền của Fredrik Lundh có mặt tại ElementTree.py

+0

Cảm ơn bạn tôi sẽ cho nó một đi :) –

+0

Vì vậy, nó đã làm việc? – meowsqueak

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