2015-01-19 4 views
-4

У меня есть файл .xml с форматом, аналогичный приведенному ниже:Извлечение элемента XML в Python

<position name="MagRetA_1incavepos" x="-125" y="0" z="-7950" unit="cm"/> 
... 
<arb8 name="MagRetA0x1" v1x="-70" v1y="-100" v2x="-70" v2y="100" v3x="70" v3y="100" v4x="70" v4y="-100" v5x="-70" v5y="-81.5789473684" v6x="-70" v6y="81.5789473684" v7x="70" v7y="81.5789473684" v8x="70" v8y="-81.5789473684" dz="350" lunit="cm"/> 
... 
<volume name="MagRetA"> 
    <materialref ref="iron"/> 
    <solidref ref="MagRetA0x1"/> 
</volume> 
... 
<physvol> 
    <volumeref ref="MagRetA"/> 
    <positionref ref="MagRetA_1incavepos"/> 
</physvol> 

Теперь, как вы думаете, можно написать скрипт, который читает «MagRetA0x1» в качестве входных данных и вывести правильное положение на оси z: -7600?

+2

Да. Но где ваш код демонстрирует вашу попытку. – JonB

+0

Где вы находите '-7600'? – Jotne

+2

@Jotne 'z' значение от' 'смещено' dz' из элемента '. –

ответ

1

lxml изготовлен для этого. Для получения информации о lxml см. http://lxml.de/parsing.html. Так как я только с помощью etree, это то, что я импортирования:

from lxml import etree 

сначала вы должны добавить корень к вашему XML, поскольку он не имеет ни одного:

xml = r'''<root> 
    <position name="MagRetA_1incavepos" x="-125" y="0" z="-7950" unit="cm"/> 
    <arb8 name="MagRetA0x1" v1x="-70" v1y="-100" v2x="-70" v2y="100" v3x="70" v3y="100" v4x="70" v4y="-100" v5x="-70" v5y="-81.5789473684" v6x="-70" v6y="81.5789473684" v7x="70" v7y="81.5789473684" v8x="70" v8y="-81.5789473684" dz="350" lunit="cm"/> 
    <volume name="MagRetA"> 
    <materialref ref="iron"/> 
    <solidref ref="MagRetA0x1"/> 
    </volume> 
    <physvol> 
    <volumeref ref="MagRetA"/> 
    <positionref ref="MagRetA_1incavepos"/> 
    </physvol> 
</root>''' 

следующий разобрать его в элемент -tree объект, используемый LXML:

root = etree.fromstring(xml) 

и получить желаемые элементы, которые имеют правильное имя и имеют атрибуты, которые вы ищете с помощью XPath и listcomprehension:

elements = root.xpath(r'//*[@name="MagRetA0x1"]') 
result = [x.get('z') for x in elements if 'z' in x.attrib] 

Честно говоря, я не понимаю, как вы получаете значение z -7600 из этого xml-файла, поэтому вы, вероятно, захотите сделать некоторые дополнительные вычисления, но по сути вы можете использовать ту же технику.

Если вы хотите узнать больше о XPaths см выбранный ответ в: https://stackoverflow.com/questions/4171759/xpath-generator

+0

'result = [x.get ('z') для x в элементах, если не x.get ('z')]' выглядит неправильно. – DSM

+0

ОК, вы правы, я отредактировал его, чтобы проверить, существует ли атрибут – RvdBerg

+0

, вы должны заменить z-> dz. Теперь это дает мне выходное значение dz, но не значение z, определенное в строке 2 <имя позиции = "MagRetA_1incavepos" x = "- 125" y = "0" z = "- 7950" единица = "см"/> есть ли способ печати и связанного с ним значения z? – leoredi

0

Некоторые, как это?

awk '/name="MagRetA_1incavepos/ {split($0,a,"z=\"");split(a[2],b,"\"");z=b[1]} /name="MagRetA0x1"/ {split($0,a,"dz=\"");split(a[2],b,"\"");z+=b[1]} END {print z}' file.xml 
-7600 
Смежные вопросы