2011-10-26 20 views
18

Tôi có tệp xml mà tôi đang sử dụng etree từ lxml để làm việc, nhưng khi tôi thêm thẻ vào nó, in ấn dường như không hoạt động .In đẹp trong lxml không thành công khi tôi thêm thẻ vào cây được phân tích cú pháp

>>> from lxml import etree 
>>> root = etree.parse('file.xml').getroot() 
>>> print etree.tostring(root, pretty_print = True) 

<root> 
    <x> 
    <y>test1</y> 
    </x> 
</root> 

Cho đến nay rất tốt. Nhưng bây giờ

>>> x = root.find('x') 
>>> z = etree.SubElement(x, 'z') 
>>> etree.SubElement(z, 'z1').attrib['value'] = 'val1' 
>>> print etree.tostring(root, pretty_print = True) 

<root> 
    <x> 
    <y>test1</y> 
    <z><z1 value="val1"/></z></x> 
</root> 

không còn đẹp nữa. Tôi cũng đã cố gắng làm điều đó "ngược", nơi tôi tạo thẻ z1, sau đó tạo thẻ z và nối thêm z1 vào thẻ, sau đó nối thẻ z vào thẻ x. Nhưng tôi nhận được kết quả tương tự.

Nếu tôi không phân tích cú pháp tệp và chỉ tạo tất cả các thẻ trong một lần, thẻ sẽ in chính xác. Vì vậy, tôi nghĩ rằng nó có một cái gì đó để làm với phân tích cú pháp các tập tin.

Làm cách nào để in ấn đẹp để hoạt động?

Trả lời

30

Nó phải làm với cách lxml xử lý khoảng trắng - xem lxml FAQ để biết chi tiết.

Để sửa lỗi này, thay đổi một phần tải của tập tin như sau:

parser = etree.XMLParser(remove_blank_text=True) 
root = etree.parse('file.xml', parser).getroot() 

tôi không kiểm tra nó, nhưng nó phải thụt tập tin của bạn chỉ tốt với sự thay đổi này.

+1

Rất vui, điều này dường như đang hoạt động. Tôi đã nhìn thấy câu hỏi thường gặp đó, nhưng tôi đoán tôi đã đọc sai. Tôi nghĩ rằng nó đã nói rằng nó chỉ nên quan trọng nếu bạn có dữ liệu văn bản với khoảng trắng trong nó, mà tôi đã không. Nhưng tôi đoán nó quan trọng nếu bạn có _any_ yếu tố với dữ liệu văn bản ở tất cả. Cảm ơn đã sửa chữa nhanh chóng. –

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