Working With Namespace While Parsing Xml Using Elementtree
Solution 1:
There are two problems on this line:
a=tree.find('parent')
First, <parent>
is not an immediate child of the root element. <parent>
is a grandchild of the root element. The path to parent looks like /project/grandparent/parent
. To search for <parent>
, try the XPath expression */parent
or possiblly //parent
.
Second, <parent>
exists in the default namespace, so you won't be able to .find()
it with just its simple name. You'll need to add the namespace.
Here are two equally valid calls to tree.find()
, each of which should find the <parent>
node:
a=tree.find('*/{http://maven.apache.org/POM/4.0.0}parent')
a=tree.find('*/xmlns:parent', namespaces=spaces)
Next, the call to findall()
needs a namespace qualifier:
forbina.findall('xmlns:child', namespaces=spaces)
Fourth, the call to create the new child element needs a namespace qualifier. There may be a way to use the shortcut name, but I couldn't find it. I had to use the long form of the name.
ET.SubElement(a,'{http://maven.apache.org/POM/4.0.0}child').text="Jay/Doctor"
Finally, your XML output will look ugly unless you provide a default namespace:
tree.write('test.xml', default_namespace=spaces['xmlns'])
Unrelated to the XML aspects, you copied my answer from the previous question incorrectly. The else
lines up with the for
, not with the if
:
for ...
if ...
else ...
Post a Comment for "Working With Namespace While Parsing Xml Using Elementtree"