Python: Convert XML to CSV file
up vote
5
down vote
favorite
I have an XML file like this:
<hierachy>
<att>
<Order>1</Order>
<attval>Data</attval>
<children>
<att>
<Order>1</Order>
<attval>Studyval</attval>
</att>
<att>
<Order>2</Order>
<attval>Site</attval>
</att>
</children>
</att>
<att>
<Order>2</Order>
<attval>Info</attval>
<children>
<att>
<Order>1</Order>
<attval>age</attval>
</att>
<att>
<Order>2</Order>
<attval>gender</attval>
</att>
</children>
</att>
</hierachy>
I'm trying to convert it to a CSV file like this:
Data,Studyval
Date,Site
Info,age
Info,gender
My problem is, both the parent and child names are the same- 'att' and 'attval'. How do I tell Python to distinguish between the both and give me the output?
I tried this:
import xml.etree.cElementTree as ET
tree = ET.parse('input.xml')
rebase = tree.getroot()
list =
for att in rebase.findall('att'):
name = att.find('attval').text
for each_att in att.findall('attval'):
try:
val = att.find('attval').text
print name, val
except AttributeError:
print name
and it printed the same things twice.
python xml csv xpath elementtree
add a comment |
up vote
5
down vote
favorite
I have an XML file like this:
<hierachy>
<att>
<Order>1</Order>
<attval>Data</attval>
<children>
<att>
<Order>1</Order>
<attval>Studyval</attval>
</att>
<att>
<Order>2</Order>
<attval>Site</attval>
</att>
</children>
</att>
<att>
<Order>2</Order>
<attval>Info</attval>
<children>
<att>
<Order>1</Order>
<attval>age</attval>
</att>
<att>
<Order>2</Order>
<attval>gender</attval>
</att>
</children>
</att>
</hierachy>
I'm trying to convert it to a CSV file like this:
Data,Studyval
Date,Site
Info,age
Info,gender
My problem is, both the parent and child names are the same- 'att' and 'attval'. How do I tell Python to distinguish between the both and give me the output?
I tried this:
import xml.etree.cElementTree as ET
tree = ET.parse('input.xml')
rebase = tree.getroot()
list =
for att in rebase.findall('att'):
name = att.find('attval').text
for each_att in att.findall('attval'):
try:
val = att.find('attval').text
print name, val
except AttributeError:
print name
and it printed the same things twice.
python xml csv xpath elementtree
add a comment |
up vote
5
down vote
favorite
up vote
5
down vote
favorite
I have an XML file like this:
<hierachy>
<att>
<Order>1</Order>
<attval>Data</attval>
<children>
<att>
<Order>1</Order>
<attval>Studyval</attval>
</att>
<att>
<Order>2</Order>
<attval>Site</attval>
</att>
</children>
</att>
<att>
<Order>2</Order>
<attval>Info</attval>
<children>
<att>
<Order>1</Order>
<attval>age</attval>
</att>
<att>
<Order>2</Order>
<attval>gender</attval>
</att>
</children>
</att>
</hierachy>
I'm trying to convert it to a CSV file like this:
Data,Studyval
Date,Site
Info,age
Info,gender
My problem is, both the parent and child names are the same- 'att' and 'attval'. How do I tell Python to distinguish between the both and give me the output?
I tried this:
import xml.etree.cElementTree as ET
tree = ET.parse('input.xml')
rebase = tree.getroot()
list =
for att in rebase.findall('att'):
name = att.find('attval').text
for each_att in att.findall('attval'):
try:
val = att.find('attval').text
print name, val
except AttributeError:
print name
and it printed the same things twice.
python xml csv xpath elementtree
I have an XML file like this:
<hierachy>
<att>
<Order>1</Order>
<attval>Data</attval>
<children>
<att>
<Order>1</Order>
<attval>Studyval</attval>
</att>
<att>
<Order>2</Order>
<attval>Site</attval>
</att>
</children>
</att>
<att>
<Order>2</Order>
<attval>Info</attval>
<children>
<att>
<Order>1</Order>
<attval>age</attval>
</att>
<att>
<Order>2</Order>
<attval>gender</attval>
</att>
</children>
</att>
</hierachy>
I'm trying to convert it to a CSV file like this:
Data,Studyval
Date,Site
Info,age
Info,gender
My problem is, both the parent and child names are the same- 'att' and 'attval'. How do I tell Python to distinguish between the both and give me the output?
I tried this:
import xml.etree.cElementTree as ET
tree = ET.parse('input.xml')
rebase = tree.getroot()
list =
for att in rebase.findall('att'):
name = att.find('attval').text
for each_att in att.findall('attval'):
try:
val = att.find('attval').text
print name, val
except AttributeError:
print name
and it printed the same things twice.
python xml csv xpath elementtree
python xml csv xpath elementtree
edited Aug 6 '15 at 0:24
asked Aug 5 '15 at 23:59
pam
2404620
2404620
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
6
down vote
accepted
Do not use the findall
function, as it will look for att tags in the whole tree. Just iterate the tree in order from top to bottom and grab the relevant elements in them.
from xml.etree import ElementTree
tree = ElementTree.parse('input.xml')
root = tree.getroot()
for att in root:
first = att.find('attval').text
for subatt in att.find('children'):
second = subatt.find('attval').text
print('{},{}'.format(first, second))
Which gives:
$ python process.py
Data,Studyval
Data,Site
Info,age
Info,gender
That is perfect! Thanks a ton!
– pam
Aug 6 '15 at 0:40
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
6
down vote
accepted
Do not use the findall
function, as it will look for att tags in the whole tree. Just iterate the tree in order from top to bottom and grab the relevant elements in them.
from xml.etree import ElementTree
tree = ElementTree.parse('input.xml')
root = tree.getroot()
for att in root:
first = att.find('attval').text
for subatt in att.find('children'):
second = subatt.find('attval').text
print('{},{}'.format(first, second))
Which gives:
$ python process.py
Data,Studyval
Data,Site
Info,age
Info,gender
That is perfect! Thanks a ton!
– pam
Aug 6 '15 at 0:40
add a comment |
up vote
6
down vote
accepted
Do not use the findall
function, as it will look for att tags in the whole tree. Just iterate the tree in order from top to bottom and grab the relevant elements in them.
from xml.etree import ElementTree
tree = ElementTree.parse('input.xml')
root = tree.getroot()
for att in root:
first = att.find('attval').text
for subatt in att.find('children'):
second = subatt.find('attval').text
print('{},{}'.format(first, second))
Which gives:
$ python process.py
Data,Studyval
Data,Site
Info,age
Info,gender
That is perfect! Thanks a ton!
– pam
Aug 6 '15 at 0:40
add a comment |
up vote
6
down vote
accepted
up vote
6
down vote
accepted
Do not use the findall
function, as it will look for att tags in the whole tree. Just iterate the tree in order from top to bottom and grab the relevant elements in them.
from xml.etree import ElementTree
tree = ElementTree.parse('input.xml')
root = tree.getroot()
for att in root:
first = att.find('attval').text
for subatt in att.find('children'):
second = subatt.find('attval').text
print('{},{}'.format(first, second))
Which gives:
$ python process.py
Data,Studyval
Data,Site
Info,age
Info,gender
Do not use the findall
function, as it will look for att tags in the whole tree. Just iterate the tree in order from top to bottom and grab the relevant elements in them.
from xml.etree import ElementTree
tree = ElementTree.parse('input.xml')
root = tree.getroot()
for att in root:
first = att.find('attval').text
for subatt in att.find('children'):
second = subatt.find('attval').text
print('{},{}'.format(first, second))
Which gives:
$ python process.py
Data,Studyval
Data,Site
Info,age
Info,gender
edited Aug 6 '15 at 0:30
answered Aug 6 '15 at 0:24
Havok
3,57912028
3,57912028
That is perfect! Thanks a ton!
– pam
Aug 6 '15 at 0:40
add a comment |
That is perfect! Thanks a ton!
– pam
Aug 6 '15 at 0:40
That is perfect! Thanks a ton!
– pam
Aug 6 '15 at 0:40
That is perfect! Thanks a ton!
– pam
Aug 6 '15 at 0:40
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f31844713%2fpython-convert-xml-to-csv-file%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown