2017-06-16 24 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> 

そして、私のPythonコードは "gap_xml" は、ファイルの構文解析を=

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

を抽出するために使用されます。

このコードは機能します。何らかの理由で私がxpathを試してみると、それはしません。これは、xpathでETXPathの名前を変更するだけです。私がワイルドカードを使用する必要がある理由は、 "Z 1 Index、TRADE"の代わりに、Z 1 Index *になります。

ありがとうございました。質問を改善するためにとにかく私にお知らせください。

+0

* namespace *とはなんですか?代入行を表示してください: 'namespace = ...' – Parfait

答えて

1

contains(., "Z 1 Index,")は、*Z1 Index*といいます。これはsubstringです。ここで

は、XPathからワイルドカードのようなもので、使用される名前空間をマッピングcontainsを使用した例である:

[<Element {http://tradefinder.db.com/Schemas/MEL/MelHorizon_0_4_2.xsd}OverviewLevelTimeStamp at 0x10647aa70>] 

 : 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) 

結果

はlxmlのXPathはリストを返すことに注意してくださいので、リストから一致するノードを抽出する必要があります。

+0

こんにちはサル、あなたの答えに感謝します。私は文字列の検索の間にワイルドカードが必要なので、実際には 'contains'を使用することはできません。また、ファイルが非常に大きいxmlの場合、私はここで 'tostring'を使うことはできません。 – naiminp

+0

@naiminp 'tostring'は私の例であり、私はそれを使用するように言っていません。また、 'contains'は編集を準備するワイルドカードです。 。 – salparadise

関連する問題