2015-05-07 3 views
1

Я новичок в Python и в настоящее время участвую в анализе XML. Кажется, все идет хорошо, пока я не ударил стену вложенными пространствами имен.Извлечение вложенного пространства имен из xml с помощью lxml

Ниже приведен фрагмент моего XML (с начала и дочерний элемент, который я пытаюсь разобрать:

<?xml version="1.0" encoding="UTF-8"?> 
-<CompositionPlaylist xmlns="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"> 
<!-- Generated by orca_wrapping version 3.8.3-0 --> 
<Id>urn:uuid:e0e43007-ca9b-4ed8-97b9-3ac9b272be7a</Id> 
------------- 
------------- 
------------- 
-<cc-cpl:MainClosedCaption xmlns:cc-cpl="http://www.digicine.com/PROTO- ASDCP-CC-CPL-20070926#"><Id>urn:uuid:0607e57f-edcc-46ec- 997a-d2fbc0c1ea3a</Id><EditRate>24 1</EditRate><IntrinsicDuration>2698</IntrinsicDuration></cc-cpl:MainClosedCaption> 
------------ 
------------ 
------------ 
</CompositionPlaylist> 

Что я нужно это решение для извлечения URI локального имени ' MainClosedCaption '. В этом случае я пытаюсь извлечь строку «http://www.digicine.com/PROTO- ASDCP-CC-CPL-20070926 #». Я просмотрел множество руководств, но, похоже, не может найти решение.

Если есть кто-нибудь, мы можем предоставить вам свои знания, было бы очень полезно.

Вот что я сделал до сих пор с помощью двух авторов:

#!/usr/bin/env python 

from xml.etree import ElementTree as ET #import ElementTree module as an alias ET 
from lxml import objectify, etree 

def parse(): 

import os 
import sys 
cpl_file = sys.argv[1] 
xml_file = os.path.abspath(__file__) 
xml_file = os.path.dirname(xml_file) 
xml_file = os.path.join(xml_file,cpl_file) 

with open(xml_file)as f: 
    xml = f.read() 

tree = etree.XML(xml) 

caption_namespace = etree.QName(tree.find('.//{*}MainClosedCaption')).namespace 

print caption_namespace 
print tree.nsmap 

nsmap = {} 

for ns in tree.xpath('//namespace::*'): 
    if ns[0]: 
     nsmap[ns[0]] = ns[1] 
tree.xpath('//cc-cpl:MainClosedCaption', namespace=nsmap) 

return nsmap 


if __name__=="__main__": 

parse() 

Но это не работает до сих пор. Я получил результат «Нет», когда я использовал QName для поиска тега и его пространства имен. И когда я пытаюсь найти все пространство имен в XML, используя для цикла, как было предложено в другом посте, я получил ошибку «Неизвестный тип возврата: dict»

Любые предложения pls?

+0

Я не следуя вашему описанию. В этом примере точно, какую строку вы пытаетесь извлечь? – David

+0

Я пытаюсь извлечь пространство имен ассоциированного с тегом «MainClosedCaption» –

+0

В этом случае строка, которую я пытаюсь извлечь из xml, это «http://www.digicine.com/PROTO- ASDCP -CC-CPL-20070926 # ' –

ответ

2

Эта программа выводит пространство имен указанного тега:

from lxml import etree 

xml = etree.XML('''<?xml version="1.0" encoding="UTF-8"?> 
<CompositionPlaylist xmlns="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"> 
<!-- Generated by orca_wrapping version 3.8.3-0 --> 
<Id>urn:uuid:e0e43007-ca9b-4ed8-97b9-3ac9b272be7a</Id> 
<cc-cpl:MainClosedCaption xmlns:cc-cpl="http://www.digicine.com/PROTO-ASDCP-CC-CPL-20070926#"> 
<Id>urn:uuid:0607e57f-edcc-46ec- 997a-d2fbc0c1ea3a</Id> 
<EditRate>24 1</EditRate> 
<IntrinsicDuration>2698</IntrinsicDuration> 
</cc-cpl:MainClosedCaption> 
</CompositionPlaylist> 
''') 

print etree.QName(xml.find('.//{*}MainClosedCaption')).namespace 

Результат:

http://www.digicine.com/PROTO-ASDCP-CC-CPL-20070926# 

Ссылка: http://lxml.de/tutorial.html#namespaces

+0

Я сделал то, что вы предложили, но получил «None» в результате. Пожалуйста, см. Мое оригинальное сообщение для моих кодов. –

+0

Когда я запускаю код в вашем вопросе против XML в вашем вопросе, я получаю 'http: // www.digicine.com/PROTO-ASDCP-CC-CPL-20070926 #'. (Конечно, я должен сначала исправить опечатки в вашем XML.) Возможно, фрагмент XML в вашем вопросе не представляет собой XML, который вы фактически используете? –

+0

полный XML отличается от большего количества дочерних элементов с корневым тегом. Но я также скопировал точный код, который вы вставили здесь, и я тоже получаю «Нет». –