2012-06-27 12 views
15

Có cách nào bỏ qua không gian tên XML trong tên tage trong elementtree.ElementTree không?Python: Bỏ qua xmlns trong elementtree.ElementTree

Tôi cố gắng để in tất cả technicalContact tags:

for item in root.getiterator(tag='{http://www.example.com}technicalContact'): 
     print item.tag, item.text 

Và tôi nhận được một cái gì đó như:

{http://www.example.com}technicalContact [email protected] 

Nhưng những gì tôi thực sự muốn là:

technicalContact [email protected] 

Có cách nào để chỉ hiển thị hậu tố (sans xmlns), hay tốt hơn - lặp lại qua các phần tử mà không khai báo rõ ràng xmlns?

+0

Xem câu trả lời của tôi dưới http://stackoverflow.com/a/25920989/2593383 cho hơn giải pháp chung – nonagon

Trả lời

8

Bạn có thể xác định một máy phát điện để đệ quy tìm kiếm thông qua cây yếu tố của bạn để tìm ra thẻ mà kết thúc bằng tên từ khóa thích hợp. Ví dụ: một cái gì đó như thế này:

def get_element_by_tag(element, tag): 
    if element.tag.endswith(tag): 
     yield element 
    for child in element: 
     for g in get_element_by_tag(child, tag): 
      yield g 

Điều này chỉ kiểm tra các thẻ kết thúc bằng tag, nghĩa là bỏ qua bất kỳ không gian tên hàng đầu nào. Sau đó bạn có thể duyệt qua bất kỳ thẻ mà bạn muốn như sau:

for item in get_element_by_tag(elemettree, 'technicalContact'): 
    ... 

này phát trong hành động:

>>> xml_str = """<root xmlns="http://www.example.com"> 
... <technicalContact>Test1</technicalContact> 
... <technicalContact>Test2</technicalContact> 
... </root> 
... """ 

xml_etree = etree.fromstring(xml_str) 

>>> for item in get_element_by_tag(xml_etree, 'technicalContact') 
...  print item.tag, item.text 
... 
{http://www.example.com}technicalContact Test1 
{http://www.example.com}technicalContact Test2 
+0

Hy vọng câu trả lời ở trên là câu hỏi. Một sự khác biệt tôi đã nhận thấy là 'item' trong ví dụ trình tạo không có phương thức' next'. Tuy nhiên, khác hơn là nó hoạt động trong cùng một (tương tự?) Cách để 'etree.getiterator'. – Chris

0

tôi luôn luôn kết thúc bằng cách sử dụng một cái gì đó giống như

item.tag.split("}")[1][0:] 
+0

Nó không giải quyết vấn đề lặp - tôi vẫn phải lặp qua tên thẻ đầy đủ. –

+0

Tôi không biết về bất kỳ trình xử lý xml nào khác cho python làm điều đó. Với lxml bạn có thể sử dụng xlst trên xml trước khi phân tích nó. – lebox

+2

'[0:]' là gì? – jadkik94