Как передать список csv в XML findall и вернуть подходящие потомки - PullRequest
0 голосов
/ 04 марта 2019

Здесь я хочу передать список csv в мой код на python, чтобы получить только значения Childone, которые совпадают в списке csv.Как правильно сделать это?

import xml.etree.ElementTree as ET    
import csv        
tree = ET.parse("C:/Users/thisuser/Desktop/stack.xml")
root = tree.getroot()

with open('C:/Users/thisuser/Desktop/stack.csv', 'rb') as f:
    reader = csv.reader(f)
    your_list = list(reader)

for ticket in root.findall('.//Parent'):
    Childone = ticket.find('.//Childone').text
    for Childone in your_list:

        for ticket2 in ticket.findall('.//ParentTwo'):
            Childtwo = ticket2.find('.//Childtwo').text
            print "Childone={Childone}, Childtwo={Childtwo}".format(Childone=Childone, Childtwo=Childtwo)

Желаемый результат

ChildOne=2  ChildTwo=c
ChildOne=2  ChildTwo=d

ChildOne=3  ChildTwo=c
ChildOne=3  ChildTwo=e

Текущий результат

Childone=['2'], Childtwo=a
Childone=['2'], Childtwo=b
Childone=['3'], Childtwo=a
Childone=['3'], Childtwo=b
Childone=['2'], Childtwo=c
Childone=['2'], Childtwo=d
Childone=['3'], Childtwo=c
Childone=['3'], Childtwo=d
Childone=['2'], Childtwo=c
Childone=['2'], Childtwo=e
Childone=['3'], Childtwo=c
Childone=['3'], Childtwo=e

XML SAMPLE

<Parent>
    <Childone>1</Childone>
        <ParentTwo>
            <Childtwo>a</Childtwo>
        </ParentTwo>
        <ParentTwo>
            <Childtwo>b</Childtwo>
        </ParentTwo>
</Parent>

<Parent>
    <Childone>2</Childone>
        <ParentTwo>
            <Childtwo>c</Childtwo>
        </ParentTwo>
        <ParentTwo>
            <Childtwo>d</Childtwo>
        </ParentTwo>
</Parent>

<Parent>
    <Childone>3</Childone>
        <ParentTwo>
            <Childtwo>c</Childtwo>
        </ParentTwo>
        <ParentTwo>
            <Childtwo>e</Childtwo>
        </ParentTwo>
</Parent>

EXCEL SAMPLE

enter image description here

Я получаю эту ошибку:

AttributeError: у объекта 'NoneType' нет атрибута 'text'

1 Ответ

0 голосов
/ 05 марта 2019

Вы можете перебирать свой CSV и обрабатывать только Parent элементы, которые имеют соответствующий элемент Childone (используя предикат XPath ).

Кроме того, вы уже знаете значение элемента Childone, поэтому вам нужно только значение Childtwo ...

XML Input (test.xml)

<doc>
    <Parent>
        <Childone>1</Childone>
        <ParentTwo>
            <Childtwo>a</Childtwo>
        </ParentTwo>
        <ParentTwo>
            <Childtwo>b</Childtwo>
        </ParentTwo>
    </Parent>

    <Parent>
        <Childone>2</Childone>
        <ParentTwo>
            <Childtwo>c</Childtwo>
        </ParentTwo>
        <ParentTwo>
            <Childtwo>d</Childtwo>
        </ParentTwo>
    </Parent>

    <Parent>
        <Childone>3</Childone>
        <ParentTwo>
            <Childtwo>c</Childtwo>
        </ParentTwo>
        <ParentTwo>
            <Childtwo>e</Childtwo>
        </ParentTwo>
    </Parent>
</doc>

CSV (test.csv)

2
3

Python

import xml.etree.ElementTree as ET
import csv

tree = ET.parse("test.xml")

with open('test.csv', 'rb') as f:
    reader = csv.reader(f)
    for i, row in enumerate(reader):
        if i:
            print ""
        for childtwo in tree.findall(".//Parent[Childone='{}']/ParentTwo/Childtwo".format(row[0])):
            print "ChildOne={childone}  ChildTwo={childtwo}".format(childone=row[0], childtwo=childtwo.text)

Выход

ChildOne=2  ChildTwo=c
ChildOne=2  ChildTwo=d

ChildOne=3  ChildTwo=c
ChildOne=3  ChildTwo=e
...