作者:亲爱的jackvan叔叔 | 来源:互联网 | 2023-05-18 01:51
我正在尝试使用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'}
]