2016-10-11 6 views
2

мне нужно обработать огромный файл со многими узлами структурированными любит этоПопытки перебрать XML: не может получить значения подузла в

<category name="28931778o.rjpf"> 
<name>RequestedName</name> 
<root>0</root> 
<online>1</online> 
<description xml:lang="pt-PT">mydescription </description> 
<category-links/> 
<template/> 
<parent name="PTW-0092"/> 
<custom-attributes> 
<custom-attribute name="sortkey" dt:dt="string">RequestedValue</custom-attribute> 
<custom-attribute name="ShortLink" dt:dt="string" xml:lang="pt-PT">/Requested_Url.html</custom-attribute> 
<custom-attribute name="ShortLinkActivate" dt:dt="string" xml:lang="pt-PT">true</custom-attribute> 
... 
</category> 

мне нужно, чтобы вернуться к каждой категории 3 запрашиваемых значения. Я использую Python .27 и etree. при запуске

for elem in tree.iterfind('{http://www.cc.com/a}category'): 
    requestedName = elem.find('{http://www.cc.com/a}name').text 
    print requestedName 

Он отлично работает

при запуске

for elem in tree.iterfind('{http://www.cc.com/a}category/{http://www.cc.com/a}custom-attributes/{http://www.cc.com/a}custom-attribute[@name="sortkey"]'): 
    print elem.text 

он прекрасно работает и Проблема возникает, когда я хочу, чтобы извлечь все три значения. Я пытаюсь найти «категории» узел и внутри него, чтобы найти 2 запрашиваемых значений

for elem in tree.iterfind('{http://www.cc.com/a}category'): 
    requestedName = elem.find('{http://www.cc.com/a}name').text 
    print requestedName 
    Requestedsortkey = elem.find('./{http://www.cc.com/a}custom-attributes/{http://www.cc.com/a}custom-attribute[@name="sortkey"]') 
    print Requestedsortkey.text 
    RequestedUrl = elem.find('./{http://www.cc.com/a}custom-attributes/{http://www.cc.com/a}custom-attribute[@name="ShortLink"]') 
    print RequestedUrl.text 

сбой программы с его сообщение об ошибке AttributeError: объект «NoneType» не имеет атрибута «текст»

Кто может Помогите?

+0

Вы должны проверить, нет ли объекта 'Нет', прежде чем пытаться получить доступ к атрибуту' text'. – dopstar

+0

Я не уверен, но вижу одно отличие - в новой версии вы используете '. /' В пути, но не с 'name'. – furas

+0

Огромное спасибо dopstar – Chauvinus

ответ

0

Вы правы, Допстар! Большое спасибо

for elem in tree.iterfind('{http://www.cc.com/a}category'): 
    requestedName = elem.find('{http://www.cc.com/a}name').text 
    print requestedName 
    Requestedsortkey = elem.find('{http://www.cc.com/a}custom-attributes/{http://www.cc.com/a}custom-attribute[@name="sortkey"]') 
    if Requestedsortkey <> None: 
     print Requestedsortkey.text 
    RequestedUrl = elem.find('{http://www.cc.com/a}custom-attributes/{http://www.cc.com/a}custom-attribute[@name="ShortLink"]') 
    if RequestedUrl <> None : 
     print RequestedUrl.text