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