How to get a XML block in Python
I need to rearrange / combine XML files to a new target file.
My data has the following form
<?xml version="1.0" encoding="utf-8"?>
<Level1>
<Level2>
<Level3>
<ID>1</ID>
<Name>String1</Name>
<Attribute>123</Attribute>
</Level3>
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
<Level3>
<ID>3</ID>
<Name>String3</Name>
<Attribute>789</Attribute>
</Level3>
</Level2>
</Level1>
I'm looking for a python command to get a block of Level3 via the ID, for example
getBlock(2) should deliver
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
Thanks in advance
python xml
add a comment |
I need to rearrange / combine XML files to a new target file.
My data has the following form
<?xml version="1.0" encoding="utf-8"?>
<Level1>
<Level2>
<Level3>
<ID>1</ID>
<Name>String1</Name>
<Attribute>123</Attribute>
</Level3>
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
<Level3>
<ID>3</ID>
<Name>String3</Name>
<Attribute>789</Attribute>
</Level3>
</Level2>
</Level1>
I'm looking for a python command to get a block of Level3 via the ID, for example
getBlock(2) should deliver
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
Thanks in advance
python xml
add a comment |
I need to rearrange / combine XML files to a new target file.
My data has the following form
<?xml version="1.0" encoding="utf-8"?>
<Level1>
<Level2>
<Level3>
<ID>1</ID>
<Name>String1</Name>
<Attribute>123</Attribute>
</Level3>
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
<Level3>
<ID>3</ID>
<Name>String3</Name>
<Attribute>789</Attribute>
</Level3>
</Level2>
</Level1>
I'm looking for a python command to get a block of Level3 via the ID, for example
getBlock(2) should deliver
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
Thanks in advance
python xml
I need to rearrange / combine XML files to a new target file.
My data has the following form
<?xml version="1.0" encoding="utf-8"?>
<Level1>
<Level2>
<Level3>
<ID>1</ID>
<Name>String1</Name>
<Attribute>123</Attribute>
</Level3>
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
<Level3>
<ID>3</ID>
<Name>String3</Name>
<Attribute>789</Attribute>
</Level3>
</Level2>
</Level1>
I'm looking for a python command to get a block of Level3 via the ID, for example
getBlock(2) should deliver
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
Thanks in advance
python xml
python xml
asked Nov 12 '18 at 22:34
pybertpybert
82
82
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
Here's another example of using ElementTree, but without doing all of the unnecessary for loops. The testing of the ID
value can be done in a simple XPath predicate.
Example (super basic with no error checking)
import xml.etree.ElementTree as ET
xml = """<Level1>
<Level2>
<Level3>
<ID>1</ID>
<Name>String1</Name>
<Attribute>123</Attribute>
</Level3>
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
<Level3>
<ID>3</ID>
<Name>String3</Name>
<Attribute>789</Attribute>
</Level3>
</Level2>
</Level1>"""
tree = ET.fromstring(xml)
def getBlock(xml_tree, id):
return xml_tree.find(f".//Level3[ID='id']")
print(ET.tostring(getBlock(tree, "2"), encoding="unicode"))
this will print:
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
If you'd like to use more complicated XPath, I'd recommend lxml
since ElementTree's XPath support is limited.
Thanks also to you - that is what I will use. I had a look at the documentation before, but could not manage it.
– pybert
Nov 13 '18 at 21:48
add a comment |
You can use Python's XML library to do this. The following is a code snippet to show one way of obtaining an XML block based on its children's value.
import xml.etree.ElementTree as ET
# Parse XML file, creates ElementTree object
tree = ET.parse("<XML_FILEPATH_HERE>")
root = tree.getroot()
# Get <Level3> nodes with specific id within XML ElementTree object
def getBlock(root, id_value):
for lvl_3 in root.findall('.//Level3'):
if id_value == lvl_3.find('ID').text:
print(ET.tostring(lvl_3).decode())
You can check out the python XML library document for more information.
https://docs.python.org/3/library/xml.etree.elementtree.html
Thank you very much.
– pybert
Nov 13 '18 at 21:47
add a comment |
The xml.etree.ElementTree package can do that for you.
Import your data from either string or file
Level1 = ET.fromstring(myXml)
And you'll have a tree in the form of a list of lists.
Iterating, selecting or filtering over these lists becomes easy. This iterates across a list of all Level3 elements:
Level1 = ET.fromstring(myXml)
for Level3 in Level1.findall('.//Level3'):
for child in Level3:
print (child.tag, child.text)
Thank you - what an elegant solution this is as well
– pybert
Nov 13 '18 at 21:48
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
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%2f53271072%2fhow-to-get-a-xml-block-in-python%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
Here's another example of using ElementTree, but without doing all of the unnecessary for loops. The testing of the ID
value can be done in a simple XPath predicate.
Example (super basic with no error checking)
import xml.etree.ElementTree as ET
xml = """<Level1>
<Level2>
<Level3>
<ID>1</ID>
<Name>String1</Name>
<Attribute>123</Attribute>
</Level3>
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
<Level3>
<ID>3</ID>
<Name>String3</Name>
<Attribute>789</Attribute>
</Level3>
</Level2>
</Level1>"""
tree = ET.fromstring(xml)
def getBlock(xml_tree, id):
return xml_tree.find(f".//Level3[ID='id']")
print(ET.tostring(getBlock(tree, "2"), encoding="unicode"))
this will print:
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
If you'd like to use more complicated XPath, I'd recommend lxml
since ElementTree's XPath support is limited.
Thanks also to you - that is what I will use. I had a look at the documentation before, but could not manage it.
– pybert
Nov 13 '18 at 21:48
add a comment |
Here's another example of using ElementTree, but without doing all of the unnecessary for loops. The testing of the ID
value can be done in a simple XPath predicate.
Example (super basic with no error checking)
import xml.etree.ElementTree as ET
xml = """<Level1>
<Level2>
<Level3>
<ID>1</ID>
<Name>String1</Name>
<Attribute>123</Attribute>
</Level3>
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
<Level3>
<ID>3</ID>
<Name>String3</Name>
<Attribute>789</Attribute>
</Level3>
</Level2>
</Level1>"""
tree = ET.fromstring(xml)
def getBlock(xml_tree, id):
return xml_tree.find(f".//Level3[ID='id']")
print(ET.tostring(getBlock(tree, "2"), encoding="unicode"))
this will print:
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
If you'd like to use more complicated XPath, I'd recommend lxml
since ElementTree's XPath support is limited.
Thanks also to you - that is what I will use. I had a look at the documentation before, but could not manage it.
– pybert
Nov 13 '18 at 21:48
add a comment |
Here's another example of using ElementTree, but without doing all of the unnecessary for loops. The testing of the ID
value can be done in a simple XPath predicate.
Example (super basic with no error checking)
import xml.etree.ElementTree as ET
xml = """<Level1>
<Level2>
<Level3>
<ID>1</ID>
<Name>String1</Name>
<Attribute>123</Attribute>
</Level3>
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
<Level3>
<ID>3</ID>
<Name>String3</Name>
<Attribute>789</Attribute>
</Level3>
</Level2>
</Level1>"""
tree = ET.fromstring(xml)
def getBlock(xml_tree, id):
return xml_tree.find(f".//Level3[ID='id']")
print(ET.tostring(getBlock(tree, "2"), encoding="unicode"))
this will print:
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
If you'd like to use more complicated XPath, I'd recommend lxml
since ElementTree's XPath support is limited.
Here's another example of using ElementTree, but without doing all of the unnecessary for loops. The testing of the ID
value can be done in a simple XPath predicate.
Example (super basic with no error checking)
import xml.etree.ElementTree as ET
xml = """<Level1>
<Level2>
<Level3>
<ID>1</ID>
<Name>String1</Name>
<Attribute>123</Attribute>
</Level3>
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
<Level3>
<ID>3</ID>
<Name>String3</Name>
<Attribute>789</Attribute>
</Level3>
</Level2>
</Level1>"""
tree = ET.fromstring(xml)
def getBlock(xml_tree, id):
return xml_tree.find(f".//Level3[ID='id']")
print(ET.tostring(getBlock(tree, "2"), encoding="unicode"))
this will print:
<Level3>
<ID>2</ID>
<Name>String2</Name>
<Attribute>456</Attribute>
</Level3>
If you'd like to use more complicated XPath, I'd recommend lxml
since ElementTree's XPath support is limited.
answered Nov 12 '18 at 23:56
Daniel HaleyDaniel Haley
38.7k45380
38.7k45380
Thanks also to you - that is what I will use. I had a look at the documentation before, but could not manage it.
– pybert
Nov 13 '18 at 21:48
add a comment |
Thanks also to you - that is what I will use. I had a look at the documentation before, but could not manage it.
– pybert
Nov 13 '18 at 21:48
Thanks also to you - that is what I will use. I had a look at the documentation before, but could not manage it.
– pybert
Nov 13 '18 at 21:48
Thanks also to you - that is what I will use. I had a look at the documentation before, but could not manage it.
– pybert
Nov 13 '18 at 21:48
add a comment |
You can use Python's XML library to do this. The following is a code snippet to show one way of obtaining an XML block based on its children's value.
import xml.etree.ElementTree as ET
# Parse XML file, creates ElementTree object
tree = ET.parse("<XML_FILEPATH_HERE>")
root = tree.getroot()
# Get <Level3> nodes with specific id within XML ElementTree object
def getBlock(root, id_value):
for lvl_3 in root.findall('.//Level3'):
if id_value == lvl_3.find('ID').text:
print(ET.tostring(lvl_3).decode())
You can check out the python XML library document for more information.
https://docs.python.org/3/library/xml.etree.elementtree.html
Thank you very much.
– pybert
Nov 13 '18 at 21:47
add a comment |
You can use Python's XML library to do this. The following is a code snippet to show one way of obtaining an XML block based on its children's value.
import xml.etree.ElementTree as ET
# Parse XML file, creates ElementTree object
tree = ET.parse("<XML_FILEPATH_HERE>")
root = tree.getroot()
# Get <Level3> nodes with specific id within XML ElementTree object
def getBlock(root, id_value):
for lvl_3 in root.findall('.//Level3'):
if id_value == lvl_3.find('ID').text:
print(ET.tostring(lvl_3).decode())
You can check out the python XML library document for more information.
https://docs.python.org/3/library/xml.etree.elementtree.html
Thank you very much.
– pybert
Nov 13 '18 at 21:47
add a comment |
You can use Python's XML library to do this. The following is a code snippet to show one way of obtaining an XML block based on its children's value.
import xml.etree.ElementTree as ET
# Parse XML file, creates ElementTree object
tree = ET.parse("<XML_FILEPATH_HERE>")
root = tree.getroot()
# Get <Level3> nodes with specific id within XML ElementTree object
def getBlock(root, id_value):
for lvl_3 in root.findall('.//Level3'):
if id_value == lvl_3.find('ID').text:
print(ET.tostring(lvl_3).decode())
You can check out the python XML library document for more information.
https://docs.python.org/3/library/xml.etree.elementtree.html
You can use Python's XML library to do this. The following is a code snippet to show one way of obtaining an XML block based on its children's value.
import xml.etree.ElementTree as ET
# Parse XML file, creates ElementTree object
tree = ET.parse("<XML_FILEPATH_HERE>")
root = tree.getroot()
# Get <Level3> nodes with specific id within XML ElementTree object
def getBlock(root, id_value):
for lvl_3 in root.findall('.//Level3'):
if id_value == lvl_3.find('ID').text:
print(ET.tostring(lvl_3).decode())
You can check out the python XML library document for more information.
https://docs.python.org/3/library/xml.etree.elementtree.html
answered Nov 12 '18 at 23:32
boonwjboonwj
2169
2169
Thank you very much.
– pybert
Nov 13 '18 at 21:47
add a comment |
Thank you very much.
– pybert
Nov 13 '18 at 21:47
Thank you very much.
– pybert
Nov 13 '18 at 21:47
Thank you very much.
– pybert
Nov 13 '18 at 21:47
add a comment |
The xml.etree.ElementTree package can do that for you.
Import your data from either string or file
Level1 = ET.fromstring(myXml)
And you'll have a tree in the form of a list of lists.
Iterating, selecting or filtering over these lists becomes easy. This iterates across a list of all Level3 elements:
Level1 = ET.fromstring(myXml)
for Level3 in Level1.findall('.//Level3'):
for child in Level3:
print (child.tag, child.text)
Thank you - what an elegant solution this is as well
– pybert
Nov 13 '18 at 21:48
add a comment |
The xml.etree.ElementTree package can do that for you.
Import your data from either string or file
Level1 = ET.fromstring(myXml)
And you'll have a tree in the form of a list of lists.
Iterating, selecting or filtering over these lists becomes easy. This iterates across a list of all Level3 elements:
Level1 = ET.fromstring(myXml)
for Level3 in Level1.findall('.//Level3'):
for child in Level3:
print (child.tag, child.text)
Thank you - what an elegant solution this is as well
– pybert
Nov 13 '18 at 21:48
add a comment |
The xml.etree.ElementTree package can do that for you.
Import your data from either string or file
Level1 = ET.fromstring(myXml)
And you'll have a tree in the form of a list of lists.
Iterating, selecting or filtering over these lists becomes easy. This iterates across a list of all Level3 elements:
Level1 = ET.fromstring(myXml)
for Level3 in Level1.findall('.//Level3'):
for child in Level3:
print (child.tag, child.text)
The xml.etree.ElementTree package can do that for you.
Import your data from either string or file
Level1 = ET.fromstring(myXml)
And you'll have a tree in the form of a list of lists.
Iterating, selecting or filtering over these lists becomes easy. This iterates across a list of all Level3 elements:
Level1 = ET.fromstring(myXml)
for Level3 in Level1.findall('.//Level3'):
for child in Level3:
print (child.tag, child.text)
answered Nov 12 '18 at 23:35
weegoloweegolo
394
394
Thank you - what an elegant solution this is as well
– pybert
Nov 13 '18 at 21:48
add a comment |
Thank you - what an elegant solution this is as well
– pybert
Nov 13 '18 at 21:48
Thank you - what an elegant solution this is as well
– pybert
Nov 13 '18 at 21:48
Thank you - what an elegant solution this is as well
– pybert
Nov 13 '18 at 21:48
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.
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%2f53271072%2fhow-to-get-a-xml-block-in-python%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