2017-02-02 2 views
1

У меня проблема с анализом XML-объекта с помощью find.lxml найти элемент по атрибуту text в xml с помощью переменной в выражении find

Я прочитал мои объекты XML из ответа HTTP с были ответом является HTML тела, которое я получаю от моей HTTP рутины:

xml_obj = objectify.XML(response) 

Это мой XML Объект:

print etree.tostring(xml_obj, pretty_print=True) 

<kids> 
    <kid> 
    <id>110</id> 
    <name>Peter</name> 
    </kid> 
    <kid> 
    <id>111</id> 
    <name>Paul</name> 
    </kid> 
    <kid> 
    <id>112</id> 
    <name>Mary</name> 
    </kid> 
    <kid> 
    <id>113</id> 
    <name>Jane</name> 
    </kid> 
</kids> 

Это мой код для поиска ребенка по имени:

kid_obj = xml_obj.find(‘.//kid/name[text()=“Jane”]’).getparent() 
print etree.tostring(kid_obj, pretty_print=True) 

<kid> 
    <id>113</id> 
    <name>Jane</name> 
</kid> 

Как только я заменю строку на переменную, она не работа:

kidname = “Jane” 
kid_obj = xml_obj.find(‘.//kid/name[text()=kidname]').getparent() 
print etree.tostring(kid_obj, pretty_print=True) 

AttributeError: 'NoneType' object has no attribute 'getparent' 

Это не работает либо:

kidname = “Jane” 
kid_obj = xml_obj.find('.//step/name[text()={0}]’.format(kidname)).getparent() 
print etree.tostring(kid_obj, pretty_print=True) 

AttributeError: 'NoneType' object has no attribute 'getparent' 

После того как я спал над ним в течение ночи я, наконец, нашел рабочее решение, но, возможно, не самый изящный код:

kidname = 'Jane' 
kid_obj = xml_obj.find('.//kid/name[text()="'+kidname+'"]').getparent() 
print etree.tostring(kid_obj, pretty_print=True) 

<kid> 
    <id>113</id> 
    <name>Jane</name> 
</kid> 
+0

Возможный дубликат http://stackoverflow.com/q/41985178/407651 – mzjn

ответ

0

В первом одном

xml_obj.find(‘.//kid/name[text()=kidname]’) 

«kidname» рассматривается как значение, а не переменная. Быстрое испытание было бы переименовать одного из детей с именем «kidname».

Во втором

xml_obj.find('.//step/name[text()={0}]’.format(kidname)) 

Вы не используете тот же котировки, (», а затем«).

Не могли бы вы попробовать:

xml_obj.find('.//step/name[text()={0}]'.format(kidname)) 
0

Первый пример:

kidname = 'Jane' 
kid_obj = xml_obj.find('.//kid/name[text()="{}"]'.format(kidname)).getparent() 
print etree.tostring(kid_obj, pretty_print=True) 

Второй пример:

kidname = 'Jane' 
kids = xml_obj.find('.//kid') 
success = False 
for kid in kids: 
    for property in kid: 
     if property.tag == 'name' and property.text == kidname: 
      success = True 
    if success: 
     break 
print etree.tostring(kid, pretty_print=True) 

Обратите внимание, что возможная ошибка, когда не ребенок с kidname нашел не не обрабатывается в обоих примерах.