2012-09-17 32 views
9

Khi tạo một file XML với etree Python, nếu chúng ta ghi vào tập tin một thẻ trống sử dụng SubElement, tôi nhận được:Python kiểm soát etree định dạng thẻ trống

<MyTag /> 

Thật không may, thư viện phân tích cú pháp XML của chúng tôi được sử dụng trong Fortran doesn 't xử lý này mặc dù nó là một thẻ chính xác. Cần xem:

<MyTag></MyTag> 

Có cách nào để thay đổi quy tắc định dạng hoặc điều gì đó không đồng ý để thực hiện tác vụ này không?

Trả lời

10

Sử dụng phương pháp html để viết ra tài liệu:

>>> from xml.etree import ElementTree as ET 
>>> ET.tostring(ET.fromstring('<mytag/>'), method='html') 
'<mytag></mytag>' 

Cả write() methodtostring() function hỗ trợ lập luận method từ khóa, miễn là bạn sử dụng Python 2.7 hoặc lên.

Trên các phiên bản trước của Python, bạn có thể cài đặt thư viện ElementTree bên ngoài; phiên bản 1.3 hỗ trợ từ khóa đó.

Có, có vẻ hơi lạ, nhưng đầu ra html chủ yếu xuất ra các phần tử trống làm thẻ bắt đầu và kết thúc. Một số yếu tố vẫn kết thúc dưới dạng các yếu tố thẻ trống; cụ thể là <link/>, <input/>, <br/> và như vậy. Tuy nhiên, đó là điều đó hoặc nâng cấp trình phân tích cú pháp XML của bạn để thực sự phân tích cú pháp XML tuân thủ tiêu chuẩn!

+0

Thật không may, không có trình phân tích cú pháp XML Fortran nào khác để sử dụng, vì vậy đây là lựa chọn duy nhất của chúng tôi. Cảm ơn! – tpg2114

+0

Bất kỳ cơ hội nào có cách để duy trì trường hợp của thẻ? Rõ ràng trường hợp nhạy cảm cũng là một vấn đề và 'html' không giữ nguyên trường hợp ... – tpg2114

+0

@ tpg2114: không, xin lỗi. –

0

Nếu bạn đã sed có sẵn, bạn có thể đường ống đầu ra của kịch bản python của bạn để

sed -e "s/<\([^>]*\) \/>/<\1><\/\1>/g" 

Mà sẽ tìm thấy bất kỳ sự xuất hiện của <Tag /> và thay thế nó bằng <Tag></Tag>

2

Thêm một sản phẩm nào text là một tùy chọn :

etree.SubElement(parent, 'child_tag_name').text='' 

Nhưng lưu ý rằng điều này sẽ thay đổi không chỉ biểu diễn mà còn là cấu trúc ture của tài liệu: tức là child_el.text sẽ là '' thay vì None.

Ồ, và như Martijn đã nói, hãy thử sử dụng thư viện tốt hơn.

0

Trích tóm lược mã, phiên bản của ElementTree.py tôi sử dụng chứa những điều sau đây trong một phương pháp _write:

write('<' + tagname) 
... 
if node.text or len(node): # this line is literal 
    write('>') 
    ... 
    write('</%s>' % tagname) 
else: 
    write(' />') 

Chỉ đạo chương trình truy cập Tôi tạo ra như sau:

class AlwaysTrueString(str): 
    def __nonzero__(self): return True 
true_empty_string = AlwaysTrueString() 

Sau đó tôi đặt node.text = true_empty_string trên các nút ElementTree đó, nơi tôi muốn một thẻ đóng mở chứ không phải là một thẻ tự đóng.

Bằng cách "chỉ đạo bộ đếm chương trình" Tôi có nghĩa là xây dựng một bộ đầu vào — trong trường hợp này là một đối tượng có kiểm tra sự thật hơi tò mò — với phương pháp thư viện sao cho phương pháp thư viện duyệt qua biểu đồ luồng điều khiển của nó Tôi muốn nó. Điều này là vô cùng giòn: trong một phiên bản mới của thư viện, hack của tôi có thể phá vỡ - và bạn có lẽ nên đối xử với "có thể" là "gần như được bảo đảm". Nói chung, không phá vỡ rào cản trừu tượng. Nó chỉ làm việc cho tôi ở đây.

3

Điều này đã được giải quyết trực tiếp trong Python 3.4. Từ đó trở đi, phương pháp write của xml.etree.ElementTree.ElementTree có tham số short_empty_elements đó:

điều khiển định dạng của các yếu tố có chứa không có nội dung. Nếu True (mặc định), chúng được phát ra dưới dạng một thẻ tự đóng, nếu không chúng được phát ra như một cặp thẻ bắt đầu/kết thúc.

Chi tiết khác trong số xml.etree documentation.

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