[Python] Réécrire les erreurs passées (XML)

Si vous faites un programme à la hâte, vous pouvez faire une erreur avec une colle légère appelée "Eh bien", et ce sera ridicule plus tard. Le XML du fichier de configuration du jeu que j'ai créé dans le passé était dans une situation terrible, j'ai donc essayé de le réparer en utilisant Python. (La signification de chaque tag n'est pas expliquée)

<?xml version="1.0" ?>
<charadata>
	<item>
		<id>0</id>
		<textureId>0</textureId>
		<finishIndex>2</finishIndex>
		<soundEffect>0</soundEffect>
		<motion>
			<frameCount>8</frameCount>
			<imageIndex>0</imageIndex>
		</motion>
		<motion>
			<frameCount>8</frameCount>
			<imageIndex>1</imageIndex>
		</motion>
		<motion>
			<frameCount>18</frameCount>
			<imageIndex>2</imageIndex>
		</motion>
		<motion>
			<frameCount/>
			<imageIndex/>
		</motion>
	</item>
	<item>
		<id>1</id>
		<textureId>2</textureId>
		<finishIndex>0</finishIndex>
		<soundEffect>0</soundEffect>
		<motion>
			<frameCount>4</frameCount>
			<imageIndex>0</imageIndex>
		</motion>
		<motion>
			<frameCount/>
			<imageIndex/>
		</motion>
		<motion>
			<frameCount/>
			<imageIndex/>
		</motion>
		<motion>
			<frameCount/>
			<imageIndex/>
		</motion>
	</item>
	<item>
		<id>2</id>
		<textureId>2</textureId>
		<finishIndex>1</finishIndex>
		<soundEffect>0</soundEffect>
		<motion>
			<frameCount>4</frameCount>
			<imageIndex>1</imageIndex>
		</motion>
		<motion>
			<frameCount>4</frameCount>
			<imageIndex>0</imageIndex>
		</motion>
		<motion>
			<frameCount/>
			<imageIndex/>
		</motion>
		<motion>
			<frameCount/>
			<imageIndex/>
		</motion>
	</item>
</charadata>

Aurait du être

<?xml version="1.0" ?>
<charadata>
	<item>
	<id>0</id>
	<finishIndex>2</finishIndex> 
	<soundEffect>0</soundEffect>
	<textureId>0</textureId>
	<frameCount_00>8</frameCount_00>
	<frameCount_01>8</frameCount_01>
	<frameCount_02>18</frameCount_02>
	<frameCount_03></frameCount_03>
	<imageIndex_00>0</imageIndex_00>
	<imageIndex_01>1</imageIndex_01>
	<imageIndex_02>2</imageIndex_02>
	<imageIndex_03></imageIndex_03>
	</item>
	
	<item>
	<id>1</id>
	<textureId>2</textureId>
	<finishIndex>0</finishIndex>
	<soundEffect>0</soundEffect>
	<frameCount_00>4</frameCount_00>
	<frameCount_01></frameCount_01>
	<frameCount_02></frameCount_02>
	<frameCount_03></frameCount_03>
	<imageIndex_00>0</imageIndex_00>
	<imageIndex_01></imageIndex_01>
	<imageIndex_02></imageIndex_02>
	<imageIndex_03></imageIndex_03>
	</item>
	
	<item>
	<id>2</id>
	<textureId>2</textureId>
	<finishIndex>1</finishIndex>
	<soundEffect>0</soundEffect>
	<frameCount_00>4</frameCount_00>
	<frameCount_01>4</frameCount_01>
	<frameCount_02></frameCount_02>
	<frameCount_03></frameCount_03>
	<imageIndex_00>1</imageIndex_00>
	<imageIndex_01>0</imageIndex_01>
	<imageIndex_02></imageIndex_02>
	<imageIndex_03></imageIndex_03>
	</item>
</charadata>

Je l'ai fait. Les pièces à répertorier sont gérées comme des balises individuelles. C'est une terrible omission.

J'ai eu l'occasion de réutiliser ce (âme) faux XML,

・ Une quantité difficile à fixer à la main

・ Il est plus précis de le réparer à l'aide d'un programme

Donc, j'ai essayé de faire un programme léger comme suit. (Eh bien, l'utilisation de programmes de manuels)

exchange_xml.py


# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import xml.dom.minidom as minidom

#La source d'entrée
src_path = "./aaaa.xml"
tree = ET.parse(src_path)
src_root = tree.getroot()
print("src_root:"+src_root.tag)

#Destination de sortie
dest_path = "./aaaa02.xml"
dest_root = ET.Element(src_root.tag)
print("dest_root:"+dest_root.tag)

#Obtenir et réécrire des éléments en XML
for item in src_root.findall("item"):
	#Acquisition d'élément, aucune(=Si c'est comme NULL), mettez un caractère vide
	id=""
	textureId=""
	finishIndex=""
	soundEffect=""

	frameCount_00=""
	frameCount_01=""
	frameCount_02=""
	frameCount_03=""
	imageIndex_00=""
	imageIndex_01=""
	imageIndex_02=""
	imageIndex_03=""

	if item.find("id").text is not None:
		id = item.find("id").text
	
	if item.find("textureId").text is not None:
		textureId = item.find("textureId").text

	if item.find("finishIndex").text is not None:
		finishIndex = item.find("finishIndex").text

	if item.find("soundEffect").text is not None:
		soundEffect = item.find("soundEffect").text

	if item.find("frameCount_00").text is not None:
		frameCount_00 = item.find("frameCount_00").text

	if item.find("frameCount_01").text is not None:
		frameCount_01 = item.find("frameCount_01").text

	if item.find("frameCount_02").text is not None:
		frameCount_02 = item.find("frameCount_02").text

	if item.find("frameCount_03").text is not None:
		frameCount_03 = item.find("frameCount_03").text

	if item.find("imageIndex_00").text is not None:
		imageIndex_00 = item.find("imageIndex_00").text

	if item.find("imageIndex_01").text is not None:
		imageIndex_01 = item.find("imageIndex_01").text

	if item.find("imageIndex_02").text is not None:
		imageIndex_02 = item.find("imageIndex_02").text

	if item.find("imageIndex_03").text is not None:
		imageIndex_03 = item.find("imageIndex_03").text
	
	#Ensemble d'informations de sortie
	dest_item = ET.SubElement(dest_root, "item")
	
	dest_id = ET.SubElement(dest_item, "id")
	dest_id.text = id

	dest_textureId = ET.SubElement(dest_item, "textureId")
	dest_textureId.text = textureId

	dest_finishIndex = ET.SubElement(dest_item, "finishIndex")
	dest_finishIndex.text = finishIndex

	dest_soundEffect = ET.SubElement(dest_item, "soundEffect")
	dest_soundEffect.text = soundEffect
	
	#Définir les informations de la liste
	#0ème
	motion00 = ET.SubElement(dest_item, "motion")
	motion00_frameCount = ET.SubElement(motion00, "frameCount")
	motion00_frameCount.text = frameCount_00
	
	motion00_imageIndex = ET.SubElement(motion00, "imageIndex")
	motion00_imageIndex.text = imageIndex_00

	#Premier
	motion01 = ET.SubElement(dest_item, "motion")
	motion01_frameCount = ET.SubElement(motion01, "frameCount")
	motion01_frameCount.text = frameCount_01
	
	motion01_imageIndex = ET.SubElement(motion01, "imageIndex")
	motion01_imageIndex.text = imageIndex_01

	#La deuxième
	motion02 = ET.SubElement(dest_item, "motion")
	motion02_frameCount = ET.SubElement(motion02, "frameCount")
	motion02_frameCount.text = frameCount_02
	
	motion02_imageIndex = ET.SubElement(motion02, "imageIndex")
	motion02_imageIndex.text = imageIndex_02

	#Le troisième
	motion03 = ET.SubElement(dest_item, "motion")
	motion03_frameCount = ET.SubElement(motion03, "frameCount")
	motion03_frameCount.text = frameCount_03
	
	motion03_imageIndex = ET.SubElement(motion03, "imageIndex")
	motion03_imageIndex.text = imageIndex_03

#Sortie XML réassemblée nouvellement
string = ET.tostring(dest_root, 'utf-8')
pretty_string = minidom.parseString(string).toprettyxml(indent='	')

with open(dest_path, 'w') as f:
    f.write(pretty_string)

C'est acceptable. La version Python pourrait être 2.7 ou 3.5. Il aurait été préférable d'utiliser des constantes ou des expressions régulières pour chaque nom d'élément, mais ce n'est pas un programme très volumineux, et je me demande s'il est correct de le présenter aux gens. Si vous recherchez des histoires de base sur Element Tree et minidom, vous trouverez bang bang, alors veuillez vous y référer. Cette fois, je viens de «lire XML et analyser» et «réécrire les informations XML et les exporter dans un fichier».

En fait, Python est encore un débutant, et il m'est arrivé de pouvoir faire ce que je devrais faire avec le programme cette fois, alors "Faisons-le avec Python! Cela semble être populaire! Si le but de la programmation est le même, tout le monde aura le même code. J'ai commencé par "ça m'inquiète!" ... Non, c'est bon, Python. La meilleure chose est que vous pouvez essayer le programme de manière interactive. C'est gentil avec les débutants (non, vraiment). Vous pouvez également vérifier la grammaire et vérifier les messages d'erreur en tapant le programme ligne par ligne. Vous pouvez également penser au déroulement du programme tout en tapant le code (même si ce n'est pas vraiment bon). Si un petit traitement est nécessaire à l'avenir, je pense que je vais le construire en Python.

Recommended Posts

[Python] Réécrire les erreurs passées (XML)
Réécrire le code Python2 en Python3 (2to3)
Analyser XML en Python
Générer du XML (RSS) avec Python
Lire du XML avec un espace de noms spécifié en Python
Traitez le XML avec Python.
Comparaison de la vitesse de la perspective XML Python
[Python] Analyse du XML généré aléatoirement [ElementTree]
Traiter les données Pubmed .xml avec python