I am parsing an xml file with Python using ElementTree, and I need to select tags like <PostalAddressText>
below that have tags like <insert>
inside them. How do I do that? I need to get a list of all relevant tag names in the xml file that satisfy the condition.
Here’s a fragment of XML that I am parsing (the actual text except for inside tags has been replaced with Lorem Ipsum):
JavaScript
x
17
17
1
<?xml version="1.0"?>
2
<data>
3
<PostalAddressText>123456,
4
<insert>
5
</insert>Lorem ipsum dolor sit amet, <insert>
6
</insert>consectetur adipiscing elit.<insert>
7
</insert>Etiam cursus ligula non malesuada fringilla.<delete> </delete><insert>
8
</insert>Quisque porta quam eu finibus pulvinar.<delete>or</delete><insert>er</insert> Mauris at semper urna.<delete>a</delete><insert>o</insert> Donec feugiat<delete>arcu purus</delete><insert>et lacinia</insert></PostalAddressText>
9
<PersonNameText>789012,
10
<insert>
11
</insert>Lorem ipsum dolor sit amet, <insert>
12
</insert>consectetur adipiscing elit.<insert>
13
</insert>Etiam cursus ligula non malesuada fringilla.<delete> </delete><insert>
14
</insert>Quisque porta quam eu finibus pulvinar.<delete>or</delete><insert>er</insert> Mauris at semper urna.<delete>a</delete><insert>o</insert> Donec feugiat<delete>arcu purus</delete><insert>et lacinia</insert>
15
</PersonNameText>
16
</data>
17
I have tried this but nothing gets printed to the console:
JavaScript
1
5
1
test_data = root.findall(".//")
2
for el in test_data:
3
if el.text == '*<insert>*':
4
print(el.tag, el.text)
5
Advertisement
Answer
Not sure what is your expected output but see the code and output below
JavaScript
1
23
23
1
import xml.etree.ElementTree as ET
2
3
xml = '''<?xml version="1.0"?>
4
<data>
5
<PostalAddressText>123456,
6
<insert>
7
</insert>Lorem ipsum dolor sit amet, <insert>
8
</insert>consectetur adipiscing elit.<insert>
9
</insert>Etiam cursus ligula non malesuada fringilla.<delete> </delete><insert>
10
</insert>Quisque porta quam eu finibus pulvinar.<delete>or</delete><insert>er</insert> Mauris at semper urna.<delete>a</delete><insert>o</insert> Donec feugiat<delete>arcu purus</delete><insert>et lacinia</insert></PostalAddressText>
11
<PersonNameText>789012,
12
<insert>
13
</insert>Lorem ipsum dolor sit amet, <insert>
14
</insert>consectetur adipiscing elit.<insert>
15
</insert>Etiam cursus ligula non malesuada fringilla.<delete> </delete><insert>
16
</insert>Quisque porta quam eu finibus pulvinar.<delete>or</delete><insert>er</insert> Mauris at semper urna.<delete>a</delete><insert>o</insert> Donec feugiat<delete>arcu purus</delete><insert>et lacinia</insert>
17
</PersonNameText>
18
</data>'''
19
20
root = ET.fromstring(xml)
21
for idx, insert in enumerate(root.findall('.//insert'), 1):
22
print(f'{idx}) {insert.text} {insert.tail}')
23
output
JavaScript
1
23
23
1
1)
2
Lorem ipsum dolor sit amet,
3
2)
4
consectetur adipiscing elit.
5
3)
6
Etiam cursus ligula non malesuada fringilla.
7
4)
8
Quisque porta quam eu finibus pulvinar.
9
5) er Mauris at semper urna.
10
6) o Donec feugiat
11
7) et lacinia None
12
8)
13
Lorem ipsum dolor sit amet,
14
9)
15
consectetur adipiscing elit.
16
10)
17
Etiam cursus ligula non malesuada fringilla.
18
11)
19
Quisque porta quam eu finibus pulvinar.
20
12) er Mauris at semper urna.
21
13) o Donec feugiat
22
14) et lacinia
23