2012-03-08 3 views
1

У меня возникают проблемы синтаксического анализа XML, когда он находится в форме:Синтаксический вложенная XML с LXML и Python

<Cars> 
    <Car> 
     <Color>Blue</Color> 
     <Make>Ford</Make> 
     <Model>Mustant</Model> 
    </Car> 
    <Car> 
     <Color>Red</Color> 
     <Make>Chevy</Make> 
     <Model>Camaro</Model> 
    </Car> 
</Cars> 

Я понял, как разобрать 1-го ребенка уровня, как это:

<Car> 
    <Color>Blue</Color> 
    <Make>Chevy</Make> 
    <Model>Camaro</Model> 
</Car> 

С такого кода:

from lxml import etree 
    a = os.path.join(localPath,file) 
    element = etree.parse(a) 
    cars = element.xpath('//Root/Foo/Bar/Car/node()[text()]') 
    parsedCars = [{field.tag: field.text for field in cars} for action in cars] 
    print parsedCars[0]['Make'] #Chevy 

Как я могу разобрать наши несколько тегов «автомобиль», который является дочерним тегом «Тачки»?

ответ

3

Попробуйте

from lxml import etree 
    a = os.path.join(localPath,file) 
    element = etree.parse(a) 
    cars = element.xpath('//Root/Foo/Bar/Car') 
    for car in cars: 
     colors = car.xpath('./Color') 
     makes = car.xpath('./Make') 
     models = car.xpath('./Model') 
+0

Когда я запускаю этот код, чтобы найти цвет, я получаю адрес, а не фактический объект. Например, при поиске цвета я получаю [<Цвет элемента в 0x2a9f0f8>] – lodkkx

+0

Они возвращают элемент-элемент. Чтобы получить текст, используйте xpath './Color/text() '' – Dikei

+0

. Да, я действительно понял это, но вместо этого использовал' ./Color/node(). В чем разница между ними - они оба дают мне текст. – lodkkx

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