gpt4 book ai didi

python - 使用 lxml 从 xml 中提取嵌套命名空间

转载 作者:行者123 更新时间:2023-12-01 04:43:06 25 4
gpt4 key购买 nike

我是 Python 新手,目前正在学习解析 XML。一切似乎都很顺利,直到我遇到了嵌套命名空间的墙。

下面是我的 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>

我需要的是一个提取本地名称“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”

请问有什么建议吗?

最佳答案

该程序打印指定标签的命名空间:

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

关于python - 使用 lxml 从 xml 中提取嵌套命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30113552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com