热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用ElementTree获取XML元素时遇到问题

我正在尝试使用Python解析XML文档,以便可以对数据进行操作并写出新文件.我正在使用的完整文件是here,但这是节选:

我正在尝试使用Python解析XML文档,以便可以对数据进行操作并写出新文件.我正在使用的完整文件是here,但这是节选:



0
















1996


Pompano Beach


FL


First Presbyterian Church







1996


Hilton Head


SC


Self Family Arts Center





最终,我想使用METADATA字段中的信息来解析RESULTSET中的列,但是现在我很难仅处理数据.这是我尝试获取METADATA元素的内容的方法:

import xml.etree.ElementTree as ET
tree = ET.parse('giglist.xml')
root = tree.getroot()
print root
metadata = tree.find("METADATA")
print metadata

打印输出:


None

为什么元数据为空?我在滥用find()方法吗?

解决方法:

您需要处理名称空间.

但是,由于仅提供了默认的名称空间,因此可以使用以下语法查找元素:

import xml.etree.ElementTree as ET
ns = 'http://www.filemaker.com/fmpxmlresult'
tree = ET.parse('giglist.xml')
root = tree.getroot()
metadata = root.find("{%s}METADATA" % ns)
print metadata # prints

以下是您可能需要查看的相关主题:

> Is there a key for the default namespace when creating dictionary for use with xml.etree.ElementTree.findall() in Python?
> Parsing XML with namespace in Python via ‘ElementTree’

UPD(获取结果列表):

import xml.etree.ElementTree as ET
ns = 'http://www.filemaker.com/fmpxmlresult'
tree = ET.parse('giglist.xml')
root = tree.getroot()
keys = [field.attrib['NAME'] for field in root.findall(".//{%(ns)s}METADATA/{%(ns)s}FIELD" % {'ns': ns})]
results = [dict(zip(keys, [col.text for col in row.findall(".//{%(ns)s}COL/{%(ns)s}DATA" % {'ns': ns})]))
for row in root.findall(".//{%(ns)s}RESULTSET/{%(ns)s}ROW" % {'ns': ns})]
print results

印刷品:

[
{'City': 'Pompano Beach', 'Country': None, 'State': 'FL', 'Theater': 'First Presbyterian Church', 'Year': '1996'},
{'City': 'Hilton Head', 'Country': None, 'State': 'SC', 'Theater': 'Self Family Arts Center', 'Year': '1996'}
]


推荐阅读
author-avatar
亲爱的jackvan叔叔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有