Füge origonale xml-Datei von für Schleife in python hinzu

Ich habe eine Master-XML-Datei namens vs_origonal_M.xml Ich möchte alle Arten von einem bestimmten Kind hinzufügen

<location> </location> <location> </location> . . . <location> </location> 

Bis alle Akten betrachtet werden.

Ich tue dies, indem ich zuerst das Verzeichnis öffne, als nächstes mache ich eine Liste aller Dateien im Verzeichnis und prüfe, ob es sich um xml-Dateien handelt, dann nehme ich ein bestimmtes Kind aus. Dann (hier ist, wo ich stecke) muss ich die Master-Datei öffnen und dieses Kind direkt unter das letzte Kind des gleichen Namens einfügen, endlich wenn alles fertig ist, muss ich die Master-XML-Datei speichern

Hier ist der Code:

 # List the xml files in the directory from xml.dom import minidom from xml.etree import ElementTree as ET import glob import os import sys def is_xml(HART_filename): string_length = len(HART_filename) suffix = '.xml' if HART_filename.endswith(suffix): return True else: return False #add the directory to the python script os.chdir("c:/Users/ME/Documents/XML_Parasing_Python") #List all the files in an array xml_list = os.listdir("c:/Users/ME/Documents/XML_Parasing_Python") print xml_list xml_list_length = len(xml_list) print xml_list_length number = 1 for number in range(1,xml_list_length): string_length = len(xml_list[number]) #print string_length print xml_list[number] #check to see if file is .xml if is_xml(xml_list[number]) == True: xmldoc = minidom.parse(xml_list[number]) reflist = xmldoc.getElementsByTagName('location') var_ref = reflist[0] print reflist[0].toxml() #Add to master .xml file tree = ET.parse('vs_original_M.xml') number += 1 else: number += 1 print 'wasn''t true' 

One Solution collect form web for “Füge origonale xml-Datei von für Schleife in python hinzu”

Es gibt wahrscheinlich einen besseren Weg zu tun, was Sie eigentlich tun wollen – vor allem gibt es eine gute Chance Ihre echte XML hat eine einzige <locations> Tag, dass alle <location> -Tags darunter gehen, also gibt es keinen Grund, nach dem letzten zu suchen <location> tag überhaupt …

Aber wie geht es dir?

 os.chdir('c:/Users/ME/Documents/XML_Parasing_Python/') origname = 'vs_original_M.xml' master = ET.parse(origname) for path in os.listdir('.'): if path != origname and os.path.splitext(path)[-1] == '.xml': child = ET.parse(path) root = child.getroot() last_location_parent = master.find('.//*[{}][last()]'.format(root.tag)) last_location_parent.append(root) master.write('master.xml') 

Das meiste ist ziemlich einfach. Sie müssen das übergeordnete Element des letzten location , dann können Sie einen anderen Knoten append .

Das einzige knifflige Bit dort ist der XPath Ausdruck in der find , also lass mich es für dich brechen (aber du musst die Docs lesen, um es wirklich zu verstehen!):

  • .// bedeutet "Nachkommen des aktuellen Knotens". (Technisch sollten Sie in der Lage sein, einfach nur für "Nachkommen der Wurzel" zu verwenden, aber es gibt Bugs in früheren Versionen von etree, also ist es sicherer auf diese Weise.)
  • * Bedeutet "mit jedem Tag-Namen".
  • [location] bedeutet "mit einem Kind" Ort "-Tag (natürlich fülle ich das Wurzel-Tag des Kindes mit der format . Wenn du weißt, dass alle deine Kinder als Wurzel Platz haben, kannst du den Tag-Namen hart kodieren , Und verschiebe den find aus der Schleife.)
  • [last()] bedeutet "das letzte".

Also, alles zusammen, das ist der letzte Nachkomme der Wurzel mit jedem Namen mit einem Kind "Ort" Tag.


Wenn du XPath nicht verstehst, kannst du die Dinge immer manuell iterieren, um den gleichen Effekt zu bekommen, aber es wird länger und leichter, subtile Bugs einzuführen, also lohnt es sich wirklich, XPath zu lernen.


Ich habe eine Menge anderer Dinge in deinem Programm gewechselt. Lassen Sie mich erklären:

Es gibt keinen Grund zu tun, if foo: return True else: return False ; Du kannst einfach return foo . Aber das bedeutet, dass deine ganze Funktion einfach return HART_filename.endswith('.xml') , also brauchst du eigentlich gar keine Funktion. Und es ist besser, os.path.splitext wie os.path.splitext als String-Funktionen auf Pfaden zu verwenden.

Wenn du for number in range(1, xml_list_length) du nicht die number = 1 am Anfang und die number += 1 in der Schleife; Die for Anweisung macht das schon für dich.

Aber du willst doch nicht bei 1 anfangen; Python-Listen werden ab 0 indiziert. Wenn du das benutzt hast, um über vs_original_M.xml zu überspringen, vs_original_M.xml das nur, wenn du Glück hast Die Reihenfolge, in der listdir die listdir zurückgibt, ist nicht spezifiziert und willkürlich. Die einzige Möglichkeit, eine Datei mit einem bestimmten Namen zu überspringen, ist, ihren Namen zu überprüfen.

Du möchtest fast niemals über die range(len(foo)) . Wenn Sie nur die Elemente von foo brauchen, nur for element in foo tun. Wenn Sie den Index für jedes Element auch benötigen, tun Sie for index, element in enumerate(foo) .

Schließlich solltest du fast nie überprüfen if foo == True . In Python sind viele Dinge "Wahrheit" neben nur True (die Nummer 74 , die Zeichenfolge "hallo", etc.), und Sie können einfach verwenden, if foo zu überprüfen, ob foo ist wahrhaftig. Verwenden Sie nur == True wenn Sie explizit wollen, dass es versagt, oder andere Wahrheitswerte; Wenn du nur das Ergebnis einer booleschen Funktion wie is_xml oder endswith oder den == Operator überprüfen is_xml endswith es einfach direkt an.

  • Wie könnte ich Elemente mit anderen Elementen in einem xml mit Minidom infundieren?
  • Flüchtige Zeichen in einer XML-Datei mit Python
  • Python Minidom XML parsing punktierte Quad / verschachtelte Kinder
  • Exakte Stringsuche in XML-Dateien?
  • Wie kann man eine XML-Datei in Python aktualisieren / ändern?
  • Wirklich einfacher Umgang mit XML in Python?
  • Beste Weg, um xml zu generieren?
  • Python - Parsing einer Datei, die mehrere XML-Teile enthält
  • Iterparse versäumt es, ein Feld zu analysieren, während andere ähnliche gut sind
  • Lesen von Excel xml zum Wörterbuch
  • Wie bekommst du djangorestframework, um xml mit Format-Suffix zurückzugeben?
  • Python ist die beste Programmiersprache der Welt.