Python Forum
Copying XML elements from one file to another
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Copying XML elements from one file to another
#1
I've now been getting used to the etree option and I want to take specific XML Tags and Texts from one file to another.
My code looks like this:

# coding=utf-8
import os
import xml.etree.ElementTree as et


# Folgender Block schreibt die Daten in ein  Objekt
base_path = os.path.dirname(os.path.realpath(__file__))
xml_file1 = os.path.join(base_path, "data\\file1.xml")
xml_file2 = os.path.join(base_path, "data\\file2.xml")

# Die Datei, dessen inhalt ergänzt wird
tree1 = et.parse(xml_file1)
root1 = tree1.getroot()

# Die Datei, dessen Inhalt mit File1 verglichen wird
tree2 = et.parse(xml_file2)
root2 = tree2.getroot()

# Dictionaries für die jeweiligen XML-Files
dict1 = {}
dict2 = {}

# Kopieren der wichtigen Werte von SRC zu Target_tree,
src_elements = tree2.findall('.//Mdata')
target_tree = tree1.find('.//Movieparameter')

for src_element in src_elements:
    for sub_src_element in src_element.getchildren():
        if sub_src_element.tag == "Price" or "Reseller":
            target_tree.append(sub_src_element)

tree1.write("infodump.xml")
My Files look like this:
<BASE>
	<Meta>
		<Randominfo>Random</Randominfo>
	</Meta>
	<MovieList>
		<Movie>
			<Movieparameters>
				<Movieparameter genre="Action" Title="Matrix">
				<Length>120 mins</Length>
				<Blu-Ray>Yes</Blu-Ray>
				<Available>No</Available>
				<LentTo>Mr Anderson</LentTo>
				</Movieparameter>
			</Movieparameters>
			<Storeparameter>
				<ID>0001</ID>
			</Storeparameter>
		</Movie>
		<Movie>
			<Movieparameters>
				<Movieparameter genre="Action" Title="Matrix Reloaded">
				<Length>111 mins</Length>
				<Blu-Ray>Yes</Blu-Ray>
				<Available>No</Available>
				<LentTo>Carrie Ann Moss</LentTo>
				</Movieparameter>
			</Movieparameters>
			<Storeparameter>
				<ID>0005</ID>
			</Storeparameter>
		</Movie>
		<Movie>
			<Movieparameters>
				<Movieparameter genre="DogMovie" Title="Woofworld">
				<Length>120 mins</Length>
				<Blu-Ray>no</Blu-Ray>
				<Available>No</Available>
				<LentTo>Mr Woofer</LentTo>
				</Movieparameter>
			</Movieparameters>
			<Storeparameter>
				<ID>0002</ID>
			</Storeparameter>
		</Movie>
		<Movie>
			<Movieparameters>
				<Movieparameter genre="Live Concert" Title="BORK">
				<Length>30 mins</Length>
				<Blu-Ray>Yes</Blu-Ray>
				<Available>Yes</Available>
				<LentTo>None</LentTo>
				</Movieparameter>
			</Movieparameters>
			<Storeparameter>
				<ID>0003</ID>
			</Storeparameter>
		</Movie>
	</MovieList>
</BASE>
File2
<ArrayOfData>
	<Mdata>
		<MovieGenre>Action</MovieGenre>
		<MovieName>Matrix</MovieName>
		<IMDBID>0178544444</IMDBID>
		<Reseller>SmithAndSmith</Reseller>
		<Price>10 Eur</Price>
		<Length>120 mins</Length>
		<Blu-Ray>Yes</Blu-Ray>
	</Mdata>
	<Mdata>
		<MovieGenre>Action</MovieGenre>
		<MovieName>Matrix Reloaded</MovieName>
		<IMDBID>0178555555</IMDBID>
		<Reseller>SmithAndSmith</Reseller>
		<Price>12 Eur</Price>
		<Length>111 mins</Length>
		<Blu-Ray>Yes</Blu-Ray>
	</Mdata>
	<Mdata>
		<MovieGenre>DogMovie</MovieGenre>
		<MovieName>WoofWorld</MovieName>
		<IMDBID>09647852154</IMDBID>
		<Reseller>DogsAndDogs</Reseller>
		<Price>5 Eur</Price>
		<Length>120 mins</Length>
		<Blu-Ray>No</Blu-Ray>
	</Mdata>
		<MovieGenre>Live Concert</MovieGenre>
		<MovieName>BORK</MovieName>
		<IMDBID>1337852</IMDBID>
		<Reseller>DogsAndDogs</Reseller>
		<Price>5 Eur</Price>
		<Length>120 mins</Length>
		<Blu-Ray>Yes</Blu-Ray>
	<Mdata>
	
	</Mdata>
</ArrayOfData>
My result looks like this:
<BASE>
	<Meta>
		<Randominfo>Random</Randominfo>
	</Meta>
	<MovieList>
		<Movie>
			<Movieparameters>
				<Movieparameter Title="Matrix" genre="Action">
				<Length>120 mins</Length>
				<Blu-Ray>Yes</Blu-Ray>
				<Available>No</Available>
				<LentTo>Mr Anderson</LentTo>
				<MovieGenre>Action</MovieGenre>
		<MovieName>Matrix</MovieName>
		<IMDBID>0178544444</IMDBID>
		<Reseller>SmithAndSmith</Reseller>
		<Price>10 Eur</Price>
		<Length>120 mins</Length>
		<Blu-Ray>Yes</Blu-Ray>
	<MovieGenre>Action</MovieGenre>
		<MovieName>Matrix Reloaded</MovieName>
		<IMDBID>0178555555</IMDBID>
		<Reseller>SmithAndSmith</Reseller>
		<Price>12 Eur</Price>
		<Length>111 mins</Length>
		<Blu-Ray>Yes</Blu-Ray>
	<MovieGenre>DogMovie</MovieGenre>
		<MovieName>WoofWorld</MovieName>
		<IMDBID>09647852154</IMDBID>
		<Reseller>DogsAndDogs</Reseller>
		<Price>5 Eur</Price>
		<Length>120 mins</Length>
		<Blu-Ray>No</Blu-Ray>
	</Movieparameter>
			</Movieparameters>
			<Storeparameter>
				<ID>0001</ID>
			</Storeparameter>
		</Movie>
		<Movie>
			<Movieparameters>
				<Movieparameter Title="Matrix Reloaded" genre="Action">
				<Length>111 mins</Length>
				<Blu-Ray>Yes</Blu-Ray>
				<Available>No</Available>
				<LentTo>Carrie Ann Moss</LentTo>
				</Movieparameter>
			</Movieparameters>
			<Storeparameter>
				<ID>0005</ID>
			</Storeparameter>
		</Movie>
		<Movie>
			<Movieparameters>
				<Movieparameter Title="Woofworld" genre="DogMovie">
				<Length>120 mins</Length>
				<Blu-Ray>no</Blu-Ray>
				<Available>No</Available>
				<LentTo>Mr Woofer</LentTo>
				</Movieparameter>
			</Movieparameters>
			<Storeparameter>
				<ID>0002</ID>
			</Storeparameter>
		</Movie>
		<Movie>
			<Movieparameters>
				<Movieparameter Title="BORK" genre="Live Concert">
				<Length>30 mins</Length>
				<Blu-Ray>Yes</Blu-Ray>
				<Available>Yes</Available>
				<LentTo>None</LentTo>
				</Movieparameter>
			</Movieparameters>
			<Storeparameter>
				<ID>0003</ID>
			</Storeparameter>
		</Movie>
	</MovieList>
</BASE>
But I want it to look like this:
<ROOT>
<Meta>
	<Randominfo>Random</Randominfo>
	</Meta>
<MovieList>
	<Movie>
	
		<Movieparameters>
			<Movieparameter genre="Action" Title="Matrix">
			<Length>120 mins</Length>
			<Blu-Ray>Yes</Blu-Ray>
			<Available>No</Available>
			<LentTo>Mr Anderson</LentTo>
			<Reseller>SmithAndSmith</Reseller>
			<Price>10 Eur</Price>
			</Movieparameter>
		</Movieparameters>
		<Storeparameter>
			<ID>0001</ID>
		</Storeparameter>
	</Movie>
	<Movie>
		<Movieparameters>
			<Movieparameter genre="Action" Title="Matrix Reloaded">
			<Length>111 mins</Length>
			<Blu-Ray>Yes</Blu-Ray>
			<Available>No</Available>
			<LentTo>Carrie Ann Moss</LentTo>
			<Reseller>SmithAndSmith</Reseller>
			<Price>12 Eur</Price>
			</Movieparameter>
		</Movieparameters>
		<Storeparameter>
			<ID>0005</ID>
		</Storeparameter>
	</Movie>
	<Movie>
		<Movieparameters>
			<Movieparameter genre="DogMovie" Title="Woofworld">
			<Length>120 mins</Length>
			<Blu-Ray>no</Blu-Ray>
			<Available>No</Available>
			<LentTo>Mr Woofer</LentTo>
			<Reseller>DogsAndDogs</Reseller>
			<Price>5 Eur</Price>
			</Movieparameter>
		</Movieparameters>
		<Storeparameter>
			<ID>0002</ID>
		</Storeparameter>
	</Movie>
	<Movie>
		<Movieparameters>
			<Movieparameter genre="Live Concert" Title="BORK">
			<Length>30 mins</Length>
			<Blu-Ray>Yes</Blu-Ray>
			<Available>Yes</Available>
			<LentTo>None</LentTo>
			<Reseller>DogsAndDogs</Reseller>
			<Price>5 Eur</Price>
			</Movieparameter>
		</Movieparameters>
		<Storeparameter>
			<ID>0003</ID>
		</Storeparameter>
	</Movie>
</MovieList>
</ROOT>
The exclusion of all the Elements that are not Price and Reseller doesn't work and I don't know how to specify them. Also as you can see, it pastes a majority of the File2 document in one place in File1 instead of splitting it up. I also don't really know how to fix this problem and I am running out of ideas.

Thanks in advance for any advice, I really appreciate it.
Reply
#2
At least, this line
if sub_src_element.tag == "Price" or "Reseller":
is always evaluated as True, because the string "Reseller" coerces to boolean True.

Try the following instead:
if sub_src_element.tag == "Price" or sub_src_element.tag == "Reseller"
Reply
#3
or
if sub_src_element.tag in ["Price", "Reseller"]:
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Help copying a column from a csv to another file with some extras g0nz0uk 3 403 Feb-01-2024, 03:12 PM
Last Post: DeaD_EyE
  ValueError: Length mismatch: Expected axis has 8 elements, new values have 1 elements ilknurg 1 5,013 May-17-2022, 11:38 AM
Last Post: Larz60+
  Sorting Elements via parameters pointing to those elements. rpalmer 3 2,549 Feb-10-2021, 04:53 PM
Last Post: rpalmer
  How To Find an Opening and Closing String, Copying Open/Close/Contents to New File davidshq 1 1,988 Mar-03-2020, 04:47 AM
Last Post: davidshq
  Copying a file Kundan 1 2,057 Aug-21-2019, 09:55 AM
Last Post: snippsat

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020