2017-06-16 107 views
1

我很抱歉如果通过搜索和阅读lxml文档可以很容易地回答这个问题,但我试图无效。在Python中使用XPath和ETXPath的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> 

的一个抽象的,用来提取

findshiz = ETXPath("//" + namespace + "DC/" + namespace + "Overviews/" + namespace + "OverviewLevelTimeStamp[" + namespace + "Identifier= 'Z 1 Index, TRADE']") 
required_nodes = findshiz(gap_xml) 

其中 “gap_xml”=文件的解析我的Python代码。

此代码有效。出于某种原因,当我尝试使用xpath时,它不会。这涉及到我只是用xpath重命名ETXPath。原因是因为我需要使用通配符,所以不是“Z 1 Index,TRADE”,而是Z 1 Index *。

谢谢,让我知道反正改善问题。

+0

*命名空间*是什么?请显示作业行:'namespace = ...' – Parfait

回答

1

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返回一个列表,所以你必须从列表中提取匹配节点。

+0

嗨,萨尔,谢谢你的回答。我不能真正使用'contains',因为我需要在字符串搜索之间使用通配符。另外,我不能在这里使用'tostring',因为该文件是一个非常大的XML。 – naiminp

+0

@naiminp'tostring'只是为了我的榜样,我没有告诉你使用它。另外,'contains'是一个通配符,用于编辑。 。 – salparadise