Home > Mobile >  Update the xml using python3 at specific subelement?
Update the xml using python3 at specific subelement?

Time:03-19

I am trying to update below xml file in python 3 using import xml.etree.ElementTree as ET but not able to add anything between tags

Issue I am facing not able to get/fetch the tag after fileSets. Can someone let me know how we could update the xml?

abc.xml

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
  http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
    http://maven.apache.org/xsd/assembly-1.1.2-xsd"
>
 <id></id>
 <formats>
  <format>zip</format>
 </formats>
 <fileSets>
   <fileSet>
     <outputDirectory>/<outputDirectory>
     <directory>../</directory>
       <useDefaultExcludes>false</useDefaultExcludes>
       <includes>
       </includes>
   </fileSet>
 </fileSets>
</assembly>

Expected output:(file names will be added dynamically) abc.xml

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
  http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
    http://maven.apache.org/xsd/assembly-1.1.2-xsd"
>
 <id></id>
 <formats>
  <format>zip</format>
 </formats>
 <fileSets>
   <fileSet>
     <outputDirectory>/<outputDirectory>
     <directory>../</directory>
       <useDefaultExcludes>false</useDefaultExcludes>
       <includes>
       <include>abc.text</include>
       <include>def.text</include>
       <include>ghi.text</include>
       </includes>
   </fileSet>
 </fileSets>
</assembly>

I am trying this and it prints me all four element inside this files but doesn't know how to access includes and then add something inside this abc.txt and so on.

import xml.etree.ElementTree as ET

tree = ET.parse(abc.xml)
root = tree.getroot()
for actor in root.findall('{http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2}fileSets'):
    for name in actor.findall('{http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2}fileSet'):
        print(name)

CodePudding user response:

You don't have to do anything with fileSets orfileSet. Since you want to add children to includes, get that element directly.

import xml.etree.ElementTree as ET
 
# Ensure that the proper prefix is used in the output (in this case, no prefix at all)
ET.register_namespace("", "http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2")
 
tree = ET.parse("abc.xml")
 
# Find the 'includes' element (.// means search the whole document).
# {*} is a wildcard and matches any namespace (Python 3.8)
includes = tree.find(".//{*}includes")
 
# Create three new 'include' elements
include1 = ET.Element("include")
include1.text = "abc.text"
 
include2 = ET.Element("include")
include2.text = "def.text"
 
include3 = ET.Element("include")
include3.text = "ghi.text"
 
# Add the new elements as children of 'includes'
includes.append(include1)
includes.append(include2)
includes.append(include3)
  • Related