2009-08-08 29 views
18

Theo mặc định, khi bạn gọi ElementTree.parse (someXMLfile) các tiền tố thư viện Python ElementTree mỗi nút phân tích cú pháp với nó là namespace URI trong Notation của Clark:Alter namespace tiền tố với ElementTree bằng Python

 
    {http://example.org/namespace/spec}mynode 

Điều này làm cho việc truy cập các nút cụ thể bằng tên một nỗi đau lớn sau này trong mã.

Tôi đã đọc qua các tài liệu về ElementTree và không gian tên và có vẻ như chức năng iterparse() sẽ cho phép tôi thay đổi cách trình phân tích cú pháp tiền tố không gian tên, nhưng đối với cuộc sống của tôi, tôi thực sự không thể thay đổi tiền tố . Nó có vẻ như có thể xảy ra ở chế độ nền trước khi sự kiện ns-start thậm chí cháy như trong ví dụ này:

for event, elem in iterparse(source): 
    if event == "start-ns": 
     namespaces.append(elem) 
    elif event == "end-ns": 
     namespaces.pop() 
    else: 
     ... 

Làm thế nào để làm cho nó thay đổi hành vi prefixing và điều thích hợp để trở lại khi các chức năng đầu là những gì ?

+1

thú vị. Tôi cũng rất muốn biết. Cách tôi tiến hành là tạo ra "hằng số" XHTML_NS = '{http://www.w3.org/1999/xhtml}' và sau đó sử dụng trong mã XHTML_NS + "mynode" – karlcow

+0

Bạn có thể giải thích những gì bạn đang thực sự cố gắng đạt được ? Tại sao ký hiệu của Clark lại là một nỗi đau lớn? –

+0

Tôi đang cố gắng tích hợp với mã hiện có truy cập mọi thứ theo tiền tố ban đầu của họ (tức là 'openSearch', thay vì' {http://a9.com/-/spec/opensearchrss/1.0/} ') và tôi đã hy vọng có một cách đẹp hơn việc tạo loại bản đồ tiền tố mà @karlcow đề cập đến. –

Trả lời

6

Bạn không cần sử dụng cụ thể iterparse. Thay vào đó, kịch bản sau đây:

from cStringIO import StringIO 
import xml.etree.ElementTree as ET 

NS_MAP = { 
    'http://www.red-dove.com/ns/abc' : 'rdc', 
    'http://www.adobe.com/2006/mxml' : 'mx', 
    'http://www.red-dove.com/ns/def' : 'oth', 
} 

DATA = '''<?xml version="1.0" encoding="utf-8"?> 
<rdc:container xmlns:mx="http://www.adobe.com/2006/mxml" 
       xmlns:rdc="http://www.red-dove.com/ns/abc" 
       xmlns:oth="http://www.red-dove.com/ns/def"> 
    <mx:Style> 
    <oth:style1/> 
    </mx:Style> 
    <mx:Style> 
    <oth:style2/> 
    </mx:Style> 
    <mx:Style> 
    <oth:style3/> 
    </mx:Style> 
</rdc:container>''' 

tree = ET.parse(StringIO(DATA)) 
some_node = tree.getroot().getchildren()[1] 
print ET.fixtag(some_node.tag, NS_MAP) 
some_node = some_node.getchildren()[0] 
print ET.fixtag(some_node.tag, NS_MAP) 

sản xuất

 
('mx:Style', None) 
('oth:style2', None) 

nào cho thấy làm thế nào bạn có thể truy cập vào tên thẻ đầy đủ điều kiện của các nút riêng biệt trong một cây phân tích cú pháp. Bạn sẽ có thể thích ứng với điều này theo nhu cầu cụ thể của bạn.

2

xml.etree.ElementTree dường như không có thẻ định dạng, tốt, không theo tài liệu. Tuy nhiên, tôi đã xem xét một số mã nguồn cho fixtag và bạn thực hiện:

import xml.etree.ElementTree as ET 

for event, elem in ET.iterparse(inFile, events=("start", "end")): 
    namespace, looktag = string.split(elem.tag[1:], "}", 1) 

Bạn có chuỗi thẻ trong thẻ tìm kiếm, phù hợp để tra cứu. Không gian tên nằm trong không gian tên.

+3

Trong Python 2.6.5 của tôi, xml.etree.ElementTree có hàm fixtag, nhưng xml.etree.cElementTree thì không. –

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