2009-05-14 24 views
24

Tôi đang cố gắng để tạo ra một tài liệu XML với namespace, hiện tại với xml.dom.minidom Python:Làm thế nào để tạo ra tài liệu XML với namespace bằng Python

import xml.dom.minidom 
doc = xml.dom.minidom.Document() 
el = doc.createElementNS('http://example.net/ns', 'el') 
doc.appendChild(el) 
print(doc.toprettyxml()) 

Các namespace được lưu (doc.childNodes[0].namespaceURI'http://example.net/ns'), nhưng tại sao nó thiếu trong đầu ra?

<?xml version="1.0" ?> 
<el/> 

tôi mong đợi:

<?xml version="1.0" ?> 
<el xmlns="http://example.net/ns" /> 

hoặc

<?xml version="1.0" ?> 
<randomid:el xmlns:randomid="http://example.net/ns" /> 

Trả lời

5

Tính năng này đã được đề xuất; một miếng vá là slumbering in the Python bug database. Xem câu trả lời của Tomalak (viết tắt: Thêm thuộc tính xmlns theo cách thủ công) để giải quyết.

21

createElementNS() được định nghĩa là:

def createElementNS(self, namespaceURI, qualifiedName): 
    prefix, localName = _nssplit(qualifiedName) 
    e = Element(qualifiedName, namespaceURI, prefix) 
    e.ownerDocument = self 
    return e 

như vậy ...

0.123.
import xml.dom.minidom 
doc = xml.dom.minidom.Document() 
el = doc.createElementNS('http://example.net/ns', 'ex:el') 
#--------------------------------------------------^^^^^ 
doc.appendChild(el) 
print(doc.toprettyxml()) 

sản lượng:

<?xml version="1.0" ?> 
<ex:el/> 

... không hoàn toàn có ...

import xml.dom.minidom 
doc = xml.dom.minidom.Document() 
el = doc.createElementNS('http://example.net/ns', 'ex:el') 
el.setAttribute("xmlns:ex", "http://example.net/ns") 
doc.appendChild(el) 
print(doc.toprettyxml()) 

sản lượng:

<?xml version="1.0" ?> 
<ex:el xmlns:ex="http://example.net/ns"/> 

cách khác:

import xml.dom.minidom 
doc = xml.dom.minidom.Document() 
el = doc.createElementNS('http://example.net/ns', 'el') 
el.setAttribute("xmlns", "http://example.net/ns") 
doc.appendChild(el) 
print(doc.toprettyxml()) 

sản xuất:

<?xml version="1.0" ?> 
<el xmlns="http://example.net/ns"/> 

Có vẻ như bạn phải làm điều đó theo cách thủ công. Element.writexml() cho thấy không có dấu hiệu cho thấy không gian tên sẽ nhận được bất kỳ điều trị đặc biệt nào.

CHỈNH SỬA: Câu trả lời này chỉ được nhắm mục tiêu ở số xml.dom.minidom, vì OP đã sử dụng câu hỏi đó trong câu hỏi. Tôi không chỉ ra rằng không thể sử dụng các không gian tên XML trong Python nói chung. ;-)

+0

Tính năng này hoạt động nhưng nó khá là hack. Tôi không thể nhớ bất kỳ triển khai DOM không gian tên nào khác không thực sự hỗ trợ các không gian tên. Tôi hy vọng có một cho Python, quá. – phihag

+0

Tôi đang tìm kiếm một mã nguồn cho minidom, và có vẻ như hack này là gần nhất bạn có thể nhận được. Hỗ trợ "đầu ra" cho các không gian tên trong minidom hầu như không tồn tại (AFAICS), chúng không được xử lý đặc biệt. Tuy nhiên chúng được phân tích cú pháp chính xác, vì vậy khi chúng ở trong chuỗi đầu vào, chúng cũng sẽ xuất hiện ở đầu ra. Khác với minidom đối xử với họ như là thuộc tính bình thường và các yếu tố với tên buồn cười. – Tomalak

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