xmlns命名空间破坏lxml

spe*_*zor 6 python lxml namespaces xml-namespaces

我试图打开一个xml文件,并从某些标签获取值.我做了很多,但这个特殊的xml给了我一些问题.这是xml文件的一部分:

<?xml version='1.0' encoding='UTF-8'?>
<package xmlns="http://apple.com/itunes/importer" version="film4.7">
  <provider>filmgroup</provider>
  <language>en-GB</language>
  <actor name="John Smith" display="Doe John"</actor>
</package>
Run Code Online (Sandbox Code Playgroud)

这是我的python代码示例:

metadata = '/Users/mylaptop/Desktop/Python/metadata.xml'
from lxml import etree
parser = etree.XMLParser(remove_blank_text=True)
open(metadata)
tree = etree.parse(metadata, parser)
root = tree.getroot()
for element in root.iter(tag='provider'):
    providerValue = tree.find('//provider')
    providerValue = providerValue.text
    print providerValue
tree.write('/Users/mylaptop/Desktop/Python/metadataDone.xml', pretty_print = True, xml_declaration = True, encoding = 'UTF-8')
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它找不到提供者标签或其值.如果我xmlns="http://apple.com/itunes/importer"按预期删除所有工作.我的问题是如何删除这个命名空间,因为我对此并不感兴趣,所以我可以使用lxml获取我需要的标记值?

unu*_*tbu 10

provider标签是在http://apple.com/itunes/importer命名空间,所以你要么需要使用完全合格的名称

{http://apple.com/itunes/importer}provider
Run Code Online (Sandbox Code Playgroud)

或使用的方法LXML具有一个namespaces参数,如root.xpath.然后,您可以使用命名空间前缀(例如ns:provider)指定它:

from lxml import etree
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse(metadata, parser)
root = tree.getroot()
namespaces = {'ns':'http://apple.com/itunes/importer'}
items = iter(root.xpath('//ns:provider/text()|//ns:actor/@name',
                       namespaces=namespaces))
for provider, actor in zip(*[items]*2):
    print(provider, actor)
Run Code Online (Sandbox Code Playgroud)

产量

('filmgroup', 'John Smith')
Run Code Online (Sandbox Code Playgroud)

请注意,上面使用的XPath假定<provider><actor>元素总是以交替出现.如果不是这样,那么当然有办法处理它,但代码变得更加冗长:

for package in root.xpath('//ns:package', namespaces=namespaces):
    for provider in package.xpath('ns:provider', namespaces=namespaces):
        providerValue = provider.text
        print providerValue
    for actor in package.xpath('ns:actor', namespaces=namespaces):
        print actor.attrib['name']
Run Code Online (Sandbox Code Playgroud)