2015-04-02 94 views
1

我的下一個類型的XML:XML搜索蟒蛇

<OUTPUT> 
    <HEADER> 

    </HEADER> 
    <REGISTER> 
     <RESULT>0</RESULT> 
     <KEY1>CAR</KEY1> 
     <KEY2>RED</KEY2> 
     <KEY3>2013</KEY3> 
     <ATTRIBUTE1>2000</ATTRIBUTE1> 
     <ATTRIBUTE2>100000</ATTRIBUTE2> 
    </REGISTER> 
    <REGISTER> 
     <RESULT>0</RESULT> 
     <KEY1>TRUCK</KEY1> 
     <KEY2>BLUE</KEY2> 
     <KEY3>2014</KEY3> 
     <ATTRIBUTE1>3000</ATTRIBUTE1> 
     <ATTRIBUTE2>400000</ATTRIBUTE2> 
    </REGISTER> 
<OUTPUT> 

我如何可以搜索ATTRIBUTE1的值,如果KEY1,KEY2,KEY3有一定的值,而在Python循環? (c#的lambda表達式的某種)

感謝@CommuSoft,我可以在libxml2中使用Xpath查詢。但是,當我嘗試使用pip install libxml2-python安裝它,我發現了錯誤

Could not find any downloads that satisfy the requirement libxml2-python 

此外,我忘了提我使用的是水蟒和Windows蟒蛇2.7。

+0

Lambda表達式?我會使用xpath查詢... – 2015-04-02 12:46:33

+0

@CommuSoft你能給我一個例子,我給了xml嗎?例如如何搜索ATTRIBUTE1值如果key1 = TRUCK,KEY2 = BLUE,KEY3 = 2014? – rlartiga 2015-04-02 12:50:18

+0

查看答案(使用xpath)。 – 2015-04-02 12:54:47

回答

3

一般來說,最好是處理XML與庫,並且在這種情況下,特別是與一個XPath query

import libxml2 

doc = libxml2.parseFile("tst.xml") 
ctxt = doc.xpathNewContext() 
res = ctxt.xpathEval("//REGISTER/ATTRIBUTE1[../KEY1/text()='TRUCK' and ../KEY2/text()='BLUE' and ../KEY3/text()='2014']") 

doc.freeDoc() 
ctxt.xpathFreeContext() 

這裏查詢:

//REGISTER/ATTRIBUTE1[../KEY1/text()='TRUCK' and ../KEY2/text()='BLUE' and ../KEY3/text()='2014'] 

結果存儲在res

+0

感謝您的回答! – rlartiga 2015-04-02 12:57:59

+0

'libxml2-python'是一個綁定,您是否安裝了'sudo apt-get install libxml2-dev lib首先是xslt1-dev? – 2015-04-02 14:24:52

+0

我正在使用Windows(據我所知,sudo不適用於windows)我必須執行什麼命令? – rlartiga 2015-04-02 14:28:01

2

使用lxml with XPath

import lxml.etree as etree 

x = """<OUTPUT> 
    <HEADER> 

    </HEADER> 
    <REGISTER> 
     <RESULT>0</RESULT> 
     <KEY1>CAR</KEY1> 
     <KEY2>RED</KEY2> 
     <KEY3>2013</KEY3> 
     <ATTRIBUTE1>2000</ATTRIBUTE1> 
     <ATTRIBUTE2>100000</ATTRIBUTE2> 
    </REGISTER> 
    <REGISTER> 
     <RESULT>0</RESULT> 
     <KEY1>TRUCK</KEY1> 
     <KEY2>BLUE</KEY2> 
     <KEY3>2014</KEY3> 
     <ATTRIBUTE1>3000</ATTRIBUTE1> 
     <ATTRIBUTE2>400000</ATTRIBUTE2> 
    </REGISTER> 
</OUTPUT>""" 

tree = etree.fromstring(x) 
xpath = "//REGISTER[./KEY1/text()='TRUCK' and ./KEY2/text()='BLUE' and ./KEY3/text()='2014']/ATTRIBUTE1" 
for attribute1 in tree.xpath(xpath): 
    print(attribute1.text) 

輸出:

3000 
+0

感謝您的回答! – rlartiga 2015-04-02 12:58:09

+0

+1,但也許你可以使用'/ text()'作爲條件?否則,如果它們具有屬性,則會出現問題... – 2015-04-02 12:59:28

+0

ltext XML(xml)不接受'.text()'。這個'./KEY3.text()='2014''給出'XPathEvalError:無效表達式':( – 2015-04-02 13:03:54