如果可以通过搜索和阅读 lxml 文档轻松回答这个问题,我深表歉意,但我试图无济于事。
我经常使用 lxml 的 findall 来查询 XML 文件。最近,我需要使用通配符来提取我需要的数据。这促使我使用 Xpath。
我已经设法使用 ETXPath 但不是 Xpath。我很困惑为什么。XML 文件的摘要
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DC xmlns="http://tradefinder.db.com/Schemas/MEL/MelHorizon_0_4_2.xsd">
<Header>
<FileName>DBL_MPA_Gap_PRD_2017-06-01T07-50-52.xml</FileName>
<ValidityDate>2017-05-31</ValidityDate>
<Version>0.42</Version>
<NoOfRecords>17228</NoOfRecords>
</Header>
<Overviews>
<OverviewLevelTimeStamp>
<Identifier>Z 1 Index, TRADE</Identifier>
<Level>2.2120000000000002</Level>
<Timestamp>09:00:00.000</Timestamp>
</OverviewLevelTimeStamp>
</Overviews>
</DC>
我的python代码用于提取
findshiz = ETXPath("//" + namespace + "DC/" + namespace + "Overviews/" + namespace + "OverviewLevelTimeStamp[" + namespace + "Identifier= 'Z 1 Index, TRADE']")
required_nodes = findshiz(gap_xml)
其中“gap_xml”=文件的解析。
此代码有效。出于某种原因,当我尝试使用 xpath 时,它没有。这涉及到我只是用 xpath 重命名 ETXPath。原因是因为我需要使用通配符,所以不是“Z 1 Index, TRADE”,而是 Z 1 Index*。
谢谢,无论如何让我知道以改善问题。
contains(., "Z 1 Index,")
就像说*Z1 Index*
,这是一个substring
搜索。
下面是一个使用contains的示例,它类似于来自 xpath的通配符并映射使用的命名空间:
: import lxml.etree as etree
: xstring = """
...: <DC xmlns="http://tradefinder.db.com/Schemas/MEL/MelHorizon_0_4_2.xsd">
...: <Header>
...: <FileName>DBL_MPA_Gap_PRD_2017-06-01T07-50-52.xml</FileName>
...: <ValidityDate>2017-05-31</ValidityDate>
...: <Version>0.42</Version>
...: <NoOfRecords>17228</NoOfRecords>
...: </Header>
...: <Overviews>
...: <OverviewLevelTimeStamp>
...: <Identifier>Z 1 Index, TRADE</Identifier>
...: <Level>2.2120000000000002</Level>
...: <Timestamp>09:00:00.000</Timestamp>
...: </OverviewLevelTimeStamp>
...: </Overviews>
...: </DC>"""
xstring = etree.fromstring(xstring)
nsmap = {'ns': 'http://tradefinder.db.com/Schemas/MEL/MelHorizon_0_4_2.xsd'}
print xstring.xpath('//ns:OverviewLevelTimeStamp[ns:Identifier[contains(., "Z 1 Index,")]]', namespaces=nsmap)
结果是
[<Element {http://tradefinder.db.com/Schemas/MEL/MelHorizon_0_4_2.xsd}OverviewLevelTimeStamp at 0x10647aa70>]
请注意, lxml xpath 返回一个列表,因此您必须从列表中提取匹配的节点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句