[Python] Schreiben Sie vergangene Fehler neu (XML)

Wenn Sie ein Programm in Eile machen, können Sie einen Fehler mit einem leichten Kleber namens "Nun" machen, und es wird später lächerlich. Das XML der Einstellungsdatei des Spiels, das ich in der Vergangenheit erstellt habe, befand sich in einer schrecklichen Situation, daher habe ich versucht, es mit Python zu beheben. (Die Bedeutung jedes Tags wird nicht erklärt)

<?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>

Gewesen sein sollte

<?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>

Ich habs gemacht. Die Teile, die aufgelistet werden sollen, werden als einzelne Tags verwaltet. Es ist eine schreckliche Auslassung.

Ich hatte die Gelegenheit, dieses (Seelen-) falsche XML wiederzuverwenden.

・ Eine schwierige Menge, die von Hand repariert werden kann

・ Es ist genauer, das Problem mit einem Programm zu beheben

Also habe ich versucht, ein Lichtprogramm wie folgt zu erstellen. (Nun, die Verwendung von Lehrbuchprogrammen)

exchange_xml.py


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

#Eingabequelle
src_path = "./aaaa.xml"
tree = ET.parse(src_path)
src_root = tree.getroot()
print("src_root:"+src_root.tag)

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

#Elemente in XML abrufen und neu schreiben
for item in src_root.findall("item"):
	#Elementerfassung, Keine(=Wenn es wie NULL ist, geben Sie ein leeres Zeichen ein
	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
	
	#Ausgabeinformationssatz
	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
	
	#Listeninformationen festlegen
	#0 ..
	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

	#Zuerst
	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

	#Der Zweite
	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

	#Der dritte
	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

#Neue Ausgabe von neu zusammengesetztem XML
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)

Das ist in Ordnung. Die Python-Version könnte 2.7 oder 3.5 sein. Es wäre besser gewesen, Konstanten oder reguläre Ausdrücke für jeden Elementnamen zu verwenden, aber es ist kein sehr großes Programm, und ich frage mich, ob es in Ordnung ist, es den Leuten vorzustellen. Wenn Sie nach grundlegenden Geschichten über Element Tree und Minidom suchen, werden Sie Bang Bang finden. Bitte beziehen Sie sich darauf. Dieses Mal habe ich nur "XML gelesen und analysiert" und "XML-Informationen neu geschrieben und in eine Datei ausgegeben".

Eigentlich ist Python noch ein Anfänger, und ich war diesmal in der Lage, das zu tun, was ich mit dem Programm tun sollte. "Machen wir es mit Python! Es scheint beliebt zu sein! Wenn der Zweck der Programmierung der gleiche ist, kann jeder den gleichen Code erstellen. Ich begann mit "Ich mache mir Sorgen!" ... Nein, es ist gut, Python. Das Beste ist, dass Sie das Programm interaktiv ausprobieren können. Dies ist einfach für Anfänger (nein, wirklich). Sie können die Grammatik und Fehlermeldungen auch überprüfen, indem Sie das Programm Zeile für Zeile eingeben. Sie können auch über den Programmablauf nachdenken, während Sie den Code eingeben (obwohl er nicht wirklich gut ist). Wenn in Zukunft ein wenig Verarbeitung erforderlich ist, werde ich sie wahrscheinlich in Python erstellen.

Recommended Posts

[Python] Schreiben Sie vergangene Fehler neu (XML)
Schreiben Sie Python2-Code in Python3 um (2to3)
Analysieren Sie XML in Python
Generieren Sie XML (RSS) mit Python
Lesen Sie XML mit dem in Python angegebenen Namespace
Verarbeiten Sie Feedly-XML mit Python.
Geschwindigkeitsvergleich der Python-XML-Perspektive
[Python] Parsen von zufällig generiertem XML [ElementTree]
Verarbeiten Sie Pubmed .xml-Daten mit Python