【发布时间】:2015-07-18 18:18:43
【问题描述】:
我是 Python 新手,目前正在学习解析 XML。一切似乎都很顺利,直到我遇到嵌套命名空间的墙。
下面是我的 xml 的 sn-p(带有我试图解析的开始和子元素:
<?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>
我需要的是一种提取本地名称“MainClosedCaption”的 URI 的解决方案。在这种情况下,我试图提取字符串“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 定位标记及其命名空间时,我得到了结果“无”。当我尝试按照另一篇文章中的建议使用 for 循环查找 XML 中的所有命名空间时,出现错误“未知返回类型:dict”
有什么建议吗?
【问题讨论】:
-
我没有听从你的描述。在这个例子中,你到底想提取什么字符串?
-
我正在尝试提取与标签 'MainClosedCaption' 关联的名称空间
-
在这种情况下,我试图从 xml 中提取的字符串是 'digicine.com/PROTO-ASDCP-CC-CPL-20070926#'
-
我发现这个solution 可能会有所帮助。
-
@DanielTan 发布一些代码,显示您到目前为止所尝试的内容。人们总是更容易根据您所拥有的提出解决方案,而不是从头开始。通常,这种解决方案也更容易被提问者理解。
标签: python xml-parsing lxml xml-namespaces elementtree