如何将csv列表传递到xmlfindall中并返回匹配的子级

2024-04-27 03:54:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在这里,我想将csv列表传递到python代码中,以便仅检索csv列表中匹配的Childone值。正确的方法是什么?你知道吗

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示例

<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示例

enter image description here

我得到这个错误:

AttributeError:“NoneType”对象没有属性“text”


Tags: csvtextinimport列表forticketlist
1条回答
网友
1楼 · 发布于 2024-04-27 03:54:38

您可以迭代csv,只处理具有匹配Childone元素的Parent元素(使用XPath predicate)。你知道吗

而且,您已经知道Childone元素值,所以您只需要Childtwo值。。。你知道吗

XML输入(测试.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(测试.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

相关问题 更多 >