如何将 csv 列表传递到 XML findall 并返回匹配的子项
How to pass a csv list into XML findall and get back matching children
在这里,我想将一个 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 样本
我收到这个错误:
AttributeError: 'NoneType' 对象没有属性 'text'
您可以遍历 csv,并且只处理具有匹配 Childone
元素(使用 XPath predicate)的 Parent
元素。
此外,您已经知道 Childone
元素值,因此您只需要 Childtwo
值...
XML 输入 (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
在这里,我想将一个 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 样本
我收到这个错误:
AttributeError: 'NoneType' 对象没有属性 'text'
您可以遍历 csv,并且只处理具有匹配 Childone
元素(使用 XPath predicate)的 Parent
元素。
此外,您已经知道 Childone
元素值,因此您只需要 Childtwo
值...
XML 输入 (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