Gio*_*lia 2 python xml xpath libxml2
我在从XML树中检索信息时遇到问题.
我的XML有这样的形状:
<?xml version="1.0"?>
<records xmlns="http://www.mysyte.com/foo">
<record>
<id>first</id>
<name>john</name>
<papers>
<paper>john_1</paper>
<paper>john_2</paper>
</papers>
</record>
<record>
<id>second</id>
<name>mike</name>
<papers>
<paper>mike_a</paper>
<paper>mike_b</paper>
</papers>
</record>
<record>
<id>third</id>
<name>albert</name>
<papers>
<paper>paper of al</paper>
<paper>other paper</paper>
</papers>
</record>
</records>
Run Code Online (Sandbox Code Playgroud)
我想要做的是提取如下的数据元组:
[{'code': 'first', 'name': 'john'},
{'code': 'second', 'name': 'mike'},
{'code': 'third', 'name': 'albert'}]
Run Code Online (Sandbox Code Playgroud)
现在我写了这个python代码:
try:
doc = libxml2.parseDoc(xml)
except (libxml2.parserError, TypeError):
print "Problems loading XML"
ctxt = doc.xpathNewContext()
ctxt.xpathRegisterNs("pre", "http://www.mysyte.com/foo")
record_nodes = ctxt.xpathEval('/pre:records/pre:record')
for record_node in record_nodes:
id = record_node.xpathEval('id')[0].content
name = record_node.xpathEval('name')[0].content
ret_list.append({'code': id, 'name': name})
Run Code Online (Sandbox Code Playgroud)
我的问题是我没有任何结果,而且当我迭代节点时,我的印象是我在使用XPATH做错了.
我也尝试使用这些XPATH来获取id和名称:
/id
/name
/record/id
/record/name
/pre:id
/pre:name
Run Code Online (Sandbox Code Playgroud)
等等,但有任何结果(顺便说一句,如果我在子查询中使用前缀,我有一个错误).
任何的想法?
这是一个建议.注意setContextNode()方法:
import libxml2
xml = "test.xml"
doc = libxml2.parseFile(xml)
ctxt = doc.xpathNewContext()
ctxt.xpathRegisterNs("pre","http://www.mysyte.com/foo")
ret_list = []
record_nodes = ctxt.xpathEval('/pre:records/pre:record')
for node in record_nodes:
ctxt.setContextNode(node)
_id = ctxt.xpathEval('pre:id')[0].content
name = ctxt.xpathEval('pre:name')[0].content
ret_list.append({'code': _id, 'name': name})
print ret_list
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8009 次 |
| 最近记录: |