2012-02-05 28 views
6

Dưới đây là mã của tôi:python và XML: làm thế nào để đặt hai tài liệu vào một tài liệu duy nhất

def extract_infos(i): 
    blabla... 
    blabla calculate v... 
    dom = xml.dom.minidom.parseString(v) 
    return dom 

doc = xml.dom.minidom.Document() 
for i in range(1,100): 
    dom = extract_infos(i) 
    for child in dom.childNodes: 
     doc.appendChild(child.cloneNode(True)) 

Hai dòng cuối cùng làm việc một lần thì:

Traceback (most recent call last): 
    File "./c.py", line 197, in <module> 
    doc.appendChild(child.cloneNode(True)) 
    File "/usr/lib/python2.6/xml/dom/minidom.py", line 1552, in appendChild 
    "two document elements disallowed") 
xml.dom.HierarchyRequestErr: two document elements disallowed 

Vì vậy, câu hỏi của tôi là: Làm thế nào để đặt hai tài liệu hiện có vào một tài liệu mới (đặt các phần tử gốc của mỗi tài liệu vào một phần tử gốc mới, bao quát).

+0

Các DOM không hoạt động theo cách đó. –

+0

@Olivier, câu trả lời của tôi cho thấy cách bạn có thể chắp thêm DOM vào một cách khác theo cách khá "sạch", nhưng tôi cho rằng bạn muốn cái gì khác. Tôi không hiểu giải pháp bạn đề cập trong phần bình luận cho câu trả lời của Lattyware. Kết quả cuối cùng là một tài liệu XML đúng ngữ pháp, hay là gì? – mzjn

+0

@Oliver Cuối cùng tôi đã hiểu câu hỏi của bạn - bạn đã yêu cầu thêm một dom vào cuối một câu hỏi khác, nhưng điều bạn thực sự muốn là lấy hai tài liệu và đặt cả hai tài liệu như một phần của tài liệu mới, đó là một điều khác. Trước đây là không thể trong khi sản xuất XML, do đó câu trả lời của tôi. Mặt khác, mặt khác, là. –

Trả lời

8

Dưới đây là cách các tài liệu XML có thể được nối vào một phần tử gốc chính bằng cách sử dụng minidom.

from xml.dom import minidom, getDOMImplementation 

XML1 = """ 
<sub1> 
<foo>BAR1</foo> 
</sub1>""" 

XML2 = """ 
<sub2> 
<foo>BAR2</foo> 
</sub2>""" 

impl = getDOMImplementation() 
doc = impl.createDocument(None, "root", None) 

for s in [XML1, XML2]: 
    elem = minidom.parseString(s).firstChild 
    doc.firstChild.appendChild(elem) 

print doc.toxml() 

=>

<?xml version="1.0" ?><root><sub1> 
<foo>BAR1</foo> 
</sub1><sub2> 
<foo>BAR2</foo> 
</sub2></root> 

Kể từ phụ Document đối tượng không hoạt động, firstChild được sử dụng để có được những mục cấp đầu Element.

+0

Đây chính xác là câu trả lời tôi đã chờ đợi, 'cảm ơn bạn rất nhiều'! –

2

Câu hỏi đặt ra hỏi làm thế nào để thêm tài liệu một XML để người kia, có nghĩa là tôi đã đưa ra câu trả lời sau đây:

Một tài liệu XML must have a single root node, vì vậy đây là không thể thực hiện trong khi sản xuất XML hợp lệ.

+0

Cảm ơn bạn đã trả lời, nhưng tiếc là tôi đã không hỏi chỉ "tại sao", nhưng "làm thế nào" quá ... Tôi vẫn không biết làm thế nào để nối thêm toàn bộ một mái vòm khác. Tôi đoán có cái gì đó để làm với 'child.cloneNode (True)' nhưng tôi không biết làm thế nào ... –

+0

@OlivierPons Những gì tôi đã nói không phải là một lý do - đó là một 'Không thể'. Bạn không thể nối thêm một mái vòm vào một cái khác vì nó sẽ không tạo ra XML. Nếu bạn thực sự muốn làm điều đó, hãy đọc nội dung của tệp và nối chúng vào cuối tệp khác dưới dạng thao tác văn bản. Điều này sẽ làm những gì bạn muốn, mặc dù kết quả sẽ là vô ích vì nó sẽ không hợp lệ XML. –

+0

Đó chính xác là những gì tôi đã làm: chuyển sang XML ('dom.toprettyxml (indent =" ") .encode ('utf-8')') sau đó loại bỏ tiêu đề '' và nối tất cả những thứ như thế này, sau đó Tôi gọi là 'dom = xml.dom.minidom.parseString (v)'. Hoạt động hoàn hảo nhưng từ quan điểm của tôi, nó không phải là "sạch". Dù sao nó hoạt động. Tôi kiểm tra câu trả lời của bạn là hợp lệ mặc dù tôi có thể tự trả lời và đưa ra giải pháp để giúp cộng đồng =) –

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