2014-11-04 2 views
0

SO Я бег программы третьей стороны, которая выводит в XML .... вот раздел XML Я интересуюсь:XML атрибут поиска Python

<something> 
    <process> 
     <iteration number="0" value="186.88" delta="0.5" nu="0.5" rho="0.125" x="0.4375" max_f_grad="45.192" max_greyness_grad="0"/> 
     <iteration number="1" value ="125.89" delta ="0.44955" nu ="0.46812" rho ="0.1217" x="0.39894" max_f_grad="4.5908" max_greyness_grad="0"/> 
     <iteration number="2" value ="90.528" delta ="0.22576" nu ="0.48615" rho ="0.15828" x="0.44465" max_f_grad="2.8968" max_greyness_grad="0"/> 
     <iteration number="3" value ="75.885" delta ="0.22523" nu ="0.49176" rho ="0.19133" x="0.44226" max_f_grad="2.8594" max_greyness_grad="0"/> 
     <iteration number="4" value ="68.869" delta ="0.21915" nu ="0.49569" rho ="0.21463" x="0.43686" max_f_grad="2.8433" max_greyness_grad="0"/> 
     <iteration number="5" value ="64.864" delta ="0.2238" nu ="0.49721" rho ="0.22948" x ="0.43071" max_f_grad="2.8375" max_greyness_grad="0"/> 
........... 
............ 
    </process> 
<something> 

Теперь я получаю значение «числа итераций» в переменной say it=200 в моем скрипте python и хочу найти соответствующую дельта и значение .... Как это сделать в python Я новичок.

ответ

1

Если вы используете xml.elementtree.Etree, вы можете получить значение любого value или delta атрибута со следующим кодом:

values_list = [] 
deltas_list = [] 
for iteration in root.findall(".//process/iteration"): 
    values_list.add(iteration.attrib["value"]) 
    deltas_list.add(iteration.attrib["delta"]) 

Если вы действительно хотите сделать что-то со значениями вы» повторно получая из атрибутов value и delta, просто отключите операторы print для чего-то, что присваивает эти значения объекту, который будет сохраняться за пределами итераций.

Это перебирает всех <process> элементов в корневом элементе <something>, и в нем перебирает всех <iteration> элементов, содержащихся внутри каждого элемента <process>.

Edit: Если я неправильно понял ваш вопрос, а что вы хотели, чтобы сохранить только значения атрибутов value и delta внутри элемента, где значение атрибута number является 200:

values = [] 
deltas = [] 
for two_hundred_iteration in root.findall(".//process/iteration[@number='200']"): 
    values.append(two_hundred_iteration.attrib["value"]) 
    deltas.append(two_hundred_iteration.attrib["delta"]) 

Обратите внимание, что этот синтаксис работает только с ElementTree 1.3 или выше, поэтому, если у вас есть Python 2.7 или меньше, он не будет работать для вас.

+0

ok, так что если я хочу сохранить 'значение' для' number = 200' в переменной ... как это сделать? – user3145076

+0

Если вы хотите сделать это, самым простым способом было бы сохранить его в списке. Для этого я изменю приведенный выше код. – furkle

+0

аргумент для 'iteration' должен соответствовать имени атрибута; например «values» должно быть «value» – jrennie

-1

Я рекомендую вам xmltodict

>>> doc = xmltodict.parse(""" 
... <something> 
...  <process> 
...   <iteration number="0" value="186.88" delta="0.5" nu="0.5" rho="0.125" x="0.4375" max_f_grad="45.192" max_greyness_grad="0"/> 
...   <iteration number="1" value ="125.89" delta ="0.44955" nu ="0.46812" rho ="0.1217" x="0.39894" max_f_grad="4.5908" max_greyness_grad="0"/> 
...   <iteration number="2" value ="90.528" delta ="0.22576" nu ="0.48615" rho ="0.15828" x="0.44465" max_f_grad="2.8968" max_greyness_grad="0"/> 
...  </process> 
... <something> 
... """) 
>>> doc["something"]["process"]["iteration"] 
... [OrderedDict([(u'@max_f_grad', u'45.192'), (u'@number', u'0'), (u'@value', u'186.88'), (u'@max_greyness_grad', u'0'), (u'@rho', u'0.125'), (u'@delta', u'0.5'), (u'@x', u'0.4375'), (u'@nu', u'0.5')]), OrderedDict([(u'@max_f_grad', u'4.5908'), (u'@number', u'1'), (u'@value', u'125.89'), (u'@max_greyness_grad', u'0'), (u'@rho', u'0.1217'), (u'@delta', u'0.44955'), (u'@x', u'0.39894'), (u'@nu', u'0.46812')]), OrderedDict([(u'@max_f_grad', u'2.8968'), (u'@number', u'2'), (u'@value', u'90.528'), (u'@max_greyness_grad', u'0'), (u'@rho', u'0.15828'), (u'@delta', u'0.22576'), (u'@x', u'0.44465'), (u'@nu', u'0.48615')])] 

С этими данными вы можете выглядеть лучше.

1

Как напечатать «значение» для итерации элемента с номером = «200» с помощью ElementTree:

for process in root.findall("process"): 
    for iteration in process.findall("iteration"): 
    if int(iteration["number"]) == 200: 
     print iteration["value"] 

берегись, ElementTree загружает XML в память, так что это не подходит для очень больших (~ гигабайтный +).

+0

Я не уверен, что пользователь обязательно захотел отфильтровать для любого конкретного номера итерации.Я не уверен, однако - вопрос очень неясен. – furkle

+0

@furkle Между вопросом и первым комментарием к вашему ответу, я думаю, что это довольно хороший ответ на вопрос. Но, лучше, чтобы OP решила/уточнила. – jrennie

+0

О, это отличный ответ и, скорее всего, ответ, который ищет OP. И я полностью застекляю часть 'number = 200', что определенно меняет мой взгляд на вопрос. Благодарю. – furkle

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