2015-04-02 4 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 если КЛЮЧ1, KEY2, KEY3 имеют некоторые значения без зацикливания в Python? (некоторая лямбда-экспрессия C#)

Я знаю благодаря @CommuSoft, что я могу использовать запросы Xpath с libxml2. Но когда я пытаюсь установить его с помощью pip install libxml2-python я нахожу ошибку

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

Кроме того, я забыл упомянуть, я использую Python 2.7 на анаконды и окна.

+0

Лямбда-выражения? Я бы использовал запрос xpath ... –

+0

@CommuSoft вы могли бы привести мне пример с xml, который я дал? Например, как искать значение ATTRIBUTE1, если key1 = TRUCK, KEY2 = BLUE, KEY3 = 2014? – rlartiga

+0

см. Ответы (с использованием xpath). –

ответ

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

+0

'libxml2-python' является обязательным, вы установили' sudo apt-get install libxml2-dev lib xslt1-dev' сначала? –

+0

Я использую окна (sudo не для окон, насколько я знаю), какую команду мне нужно выполнить? – rlartiga

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

+0

+1, но, возможно, вы можете использовать '/ text()' для условий? В противном случае это проблематично, если у них есть атрибуты ... –

+0

'.text()' не принимается lxml XPath. Этот './KEY3.text() = '2014'' дает' XPathEvalError: Invalid expression' :( –

Смежные вопросы