我有一个python脚本,用于解析XMLs并将某些感兴趣的元素导出到csv文件中。我现在尝试更改脚本以允许在条件下筛选XML文件,等效的XPath查询将是:
\DC\Events\Confirmation[contains(TransactionId,"GTEREVIEW")]
当我尝试使用lxml时,我的代码是:
xml_file = lxml.etree.parse(xml_file_path)
namespace = "{" + xml_file.getroot().nsmap[None] + "}"
node_list = xml_file.findall(namespace + "Events/" + namespace + "Confirmation[TransactionId='*GTEREVIEW*']")
但这似乎行不通。有人能帮忙吗? XML文件示例:
<Events>
<Confirmation>
<TransactionId>GTEREVIEW2012</TransactionId>
</Confirmation>
<Confirmation>
<TransactionId>GTEDEF2012</TransactionId>
</Confirmation>
</Events>
所以我想要所有包含事务Id的“确认”节点,该事务Id包含字符串“GTEREVIEW”。 谢谢
findall()
不支持XPath表达式,只支持ElementPath(请参见http://effbot.org/zone/element-xpath.htm)。ElementPath不支持搜索包含特定字符串的元素。为什么不使用XPath呢?假设文件
test.xml
包含示例XML,则以下操作有效:如果坚持使用
findall()
,那么最好的方法是获取具有TransactionId
子节点的所有Confirmation
元素的列表:然后需要手动筛选此列表,例如:
如果您的文档包含名称空间,那么如果元素使用默认名称空间(我使用
xmlns="file:xyz"
作为默认名称空间),则下面将为您获取具有Confirmation
子节点的所有TransactionId
元素:当然还有
etree.ETXPath
:这允许您组合XPath和名称空间。
相关问题 更多 >
编程相关推荐