2012-05-12 3 views
5

Có thể sử dụng lxml (hoặc thư viện builtin etree) để tạo một đối tượng đại diện cho một đoạn xml, nhưng chứa hai (hoặc nhiều) cây phân tách (tức là mỗi cây có gốc riêng biệt, nhưng chúng không có tổ tiên chung))?lxml Tạo đoạn XML không có phần tử gốc?

Đó là, là có bất cứ điều gì mà có thể đại diện cho những điều sau đây mà không cần tạo yếu tố khác để giữ cả hai trong số họ:

<tree id="A"><anotherelement/></tree> 
<tree id="B"><yetanotherelement/></tree> 

Tôi không thể nhìn thấy bất cứ điều gì trong tài liệu lxml rằng sẽ cho phép điều đó, và dường như stackoverflow không có bất cứ điều gì trực tiếp trên điểm.

Trường hợp sử dụng ở đây là tôi tạo xml theo chương trình và các đoạn sẽ được ráp thành một tài liệu cho đầu ra. Tôi muốn một đối tượng tôi không cần phải lặp qua/trường hợp đặc biệt, chỉ cần vượt qua các phương pháp lxml như thể nó là một cây thích hợp.

(Tôi biết rằng các mảnh đó sẽ không phải là tài liệu xml hoàn chỉnh và chính xác; Tôi muốn lưu trữ các sản phẩm trung gian trước khi lắp ráp vào tài liệu đó).

+0

Còn việc tạo danh sách các đối tượng lxml thì sao? Đó là khá nhiều những gì bạn có ... – larsks

+0

@ larsks Phải, nhưng sau đó tôi cần phải viết mã xử lý sự hiện diện của một danh sách, thay vì đi qua một đối tượng của loại xml API mong đợi. Điều đó cũng đòi hỏi phải đặc biệt-vỏ trong mã của tôi, hoặc luôn luôn giữ một danh sách. Đó là lý do tại sao nó sẽ là thích hợp hơn. – Marcin

Trả lời

4

có, có được như vậy một chức năng trong gói lxml.html, nó được gọi là fragment_fromstring hoặc fragments_fromstring, nhưng trong hầu hết các trường hợp, các phân tích cú pháp html cũng xử lý xml khá tốt:

from lxml import etree, html 

xml = """ 
    <tree id="A"><anotherelement/></tree> 
    <tree id="B"><yetanotherelement/></tree> 
""" 

fragments = html.fragments_fromstring(xml) 

root = etree.Element("root") 
for f in fragments: 
    root.append(f) 

print etree.tostring(root, pretty_print=True) 

đầu ra:

<root> 
    <tree id="A"> 
    <anotherelement/> 
    </tree> 
    <tree id="B"> 
    <yetanotherelement/> 
    </tree> 
</root> 

nếu bạn nhìn vào what's going on under the hood, có thể sẽ không quá khó để thực hiện tương tự bằng trình phân tích cú pháp xml nếu bạn không hài lòng với kết quả khác.

+0

Cảm ơn vì điều này. Tôi thực sự muốn tạo đoạn chương trình, vì vậy tôi sẽ nhìn trộm dưới mui xe. – Marcin

+0

Ah, nó vẫn trả về một danh sách - tôi đã hy vọng rằng sẽ có một cách để tạo ra một đối tượng mà tôi không cần phải lặp qua/trường hợp đặc biệt, chỉ cần chuyển sang các phương pháp lxml như thể nó là một cây thích hợp. Tôi sẽ chấp nhận câu trả lời này trong vài ngày tới, giả sử không ai biết về một số phương pháp ma thuật. – Marcin

+0

+1 nhưng chắc chắn quan trọng để biết rằng 'fragments_fromstring()' trả về một danh sách và 'fragment_fromstring()' sẽ chỉ trừ một phần tử duy nhất – JCotton