【问题标题】:Extracting nested namespace from a xml using lxml使用 lxml 从 xml 中提取嵌套命名空间
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我按照你的建议做了,但结果是“无”。请参阅我的原始帖子以获取我的代码。
  • 当我针对您问题中的 XML 运行您问题中的代码时,我得到http://www.digicine.com/PROTO-ASDCP-CC-CPL-20070926#。 (当然,我必须先修正您 XML 中的拼写错误。)也许您问题中的 XML sn-p 并不代表您实际使用的 XML?
  • 完整的 XML 与带有根标签的更多子元素不同。但我也复制了您在此处粘贴的确切代码,我也得到了“无”。
  • 很抱歉,但我不知道为什么我们每个人都会从完全相同的程序中得到不同的输出。
  • 顺便说一句,Rob 的建议对我有用。我目前难以提取 //MainClosedCaption/Id 元素。 stackoverflow.com/questions/37038148/…
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多