2009-12-18 13 views
6

Ich habe eine XML-Datei, die einige Daten wie angegeben enthält.Bearbeiten der XML-Texte aus einer XML-Datei mit Python

<?xml version="1.0" encoding="UTF-8" ?> 
- <ParameterData> 
    <CreationInfo date="10/28/2009 03:05:14 PM" user="manoj" /> 
- <ParameterList count="85"> 
- <Parameter name="Spec 2 Included" type="boolean" mode="both"> 
    <Value>n/a</Value> 
    <Result>n/a</Result> 
    </Parameter> 
- <Parameter name="Spec 2 Label" type="string" mode="both"> 
    <Value>n/a</Value> 
    <Result>n/a</Result> 
    </Parameter> 
- <Parameter name="Spec 3 Included" type="boolean" mode="both"> 
    <Value>n/a</Value> 
    <Result>n/a</Result> 
    </Parameter> 
- <Parameter name="Spec 3 Label" type="string" mode="both"> 
    <Value>n/a</Value> 
    <Result>n/a</Result> 
    </Parameter> 
    </ParameterList> 
    </ParameterData> 

Ich habe eine Textdatei mit Linien als

Spec 2 Included : TRUE 
Spec 2 Label: 19-Flat2-HS3 
Spec 3 Included : FALSE 
Spec 3 Label: 4-1-Bead1-HS3 

Jetzt möchte ich XML-Texte bearbeiten; ich, e. Ich möchte das Feld (n/a) durch die entsprechenden Werte aus der Textdatei ersetzen. Wie ich die Datei zu aussehen wie

<?xml version="1.0" encoding="UTF-8" ?> 
- <ParameterData> 
    <CreationInfo date="10/28/2009 03:05:14 PM" user="manoj" /> 
- <ParameterList count="85"> 
- <Parameter name="Spec 2 Included" type="boolean" mode="both"> 
    <Value>TRUE</Value> 
    <Result>TRUE</Result> 
    </Parameter> 
- <Parameter name="Spec 2 Label" type="string" mode="both"> 
    <Value>19-Flat2-HS3</Value> 
    <Result>19-Flat2-HS3</Result> 
    </Parameter> 
- <Parameter name="Spec 3 Included" type="boolean" mode="both"> 
    <Value>FALSE</Value> 
    <Result>FALSE</Result> 
    </Parameter> 
- <Parameter name="Spec 3 Label" type="string" mode="both"> 
    <Value>4-1-Bead1-HS3</Value> 
    <Result>4-1-Bead1-HS3</Result> 
    </Parameter> 
    </ParameterList> 
    </ParameterData> 

mag ich bin neu in dieser Python-XML-Codierung. Ich habe keine Ahnung, wie Sie die Textfelder in einer XML-Datei bearbeiten. Ich versuche, Elementtree.ElementTree-Modul zu verwenden. aber um die Zeilen in der XML-Datei zu lesen und die Attribute zu extrahieren, weiß ich nicht, welche Module importiert werden müssen.

Bitte helfen.

Dank und Grüße.

+1

In XML-Jargon tun könnten, die Teile, die Sie ändern wollen, werden als "Text" bezeichnet. "Attribut" bezieht sich auf Stücke wie 'name =" Spec 2 Label "' oder 'mode =" both ". –

+0

Nachdem ich ziemlich viel Zeit damit verbracht habe, herauszufinden, wie es funktioniert, indem ich die Informationen mehrerer Vorschläge kombiniere, habe ich eine unpassende, aber effektive Lösung hier geschrieben: https://stackoverflow.com/questions/1591579/how-to-update -modify-a-XML-Datei-in-Python/48087921 # 48087921. Vielleicht hilft es den Leuten, die mit einer ähnlichen Aufgabe konfrontiert sind. –

Antwort

6

Sie können Ihre Daten Text in Python-Wörterbuch von regulären Ausdrücken

data="""Spec 2 Included : TRUE 
Spec 2 Label: 19-Flat2-HS3 
Spec 3 Included : FALSE 
Spec 3 Label: 4-1-Bead1-HS3""" 

#data=open("data.txt").read() 

import re 

data=dict(re.findall('(Spec \d+ (?:Included|Label))\s*:\s*(\S+)',data)) 

data wird konvertieren, wie

{'Spec 3 Included': 'FALSE', 'Spec 2 Included': 'TRUE', 'Spec 3 Label': '4-1-Bead1-HS3', 'Spec 2 Label': '19-Flat2-HS3'} 

Dann folgt man sie unter Verwendung eines Ihrer favoriate XML-Parser umwandeln kann, ich benutze Minidom hier.

from xml.dom import minidom 

dom = minidom.parseString(xml_text) 
params=dom.getElementsByTagName("Parameter") 
for param in params: 
    name=param.getAttribute("name") 
    if name in data: 
     for item in param.getElementsByTagName("*"): # You may change to "Result" or "Value" only 
      item.firstChild.replaceWholeText(data[name]) 

print dom.toxml() 

#write to file 
open("output.xml","wb").write(dom.toxml()) 

Ergebnisse

<?xml version="1.0" ?><ParameterData> 
    <CreationInfo date="10/28/2009 03:05:14 PM" user="manoj"/> 
    <ParameterList count="85"> 
    <Parameter mode="both" name="Spec 2 Included" type="boolean"> 
     <Value>TRUE</Value> 
     <Result>TRUE</Result> 
    </Parameter> 
    <Parameter mode="both" name="Spec 2 Label" type="string"> 
     <Value>19-Flat2-HS3</Value> 
     <Result>19-Flat2-HS3</Result> 
    </Parameter> 
    <Parameter mode="both" name="Spec 3 Included" type="boolean"> 
     <Value>FALSE</Value> 
     <Result>FALSE</Result> 
    </Parameter> 
    <Parameter mode="both" name="Spec 3 Label" type="string"> 
     <Value>4-1-Bead1-HS3</Value> 
     <Result>4-1-Bead1-HS3</Result> 
    </Parameter> 
    </ParameterList> 
</ParameterData> 
+0

Sehr geehrte Marke, Dies ist so hilfreich. Danke vielmals. Ich bin auf einen albernen Schritt gestalkt. Wie kann ich die Textdatei in eine Zeichenfolge lesen, wie Sie es am Anfang mit dem Namen getan haben (data = "" "" ""). Ich meine, ich kann die Textdatei nicht in ein Wörterbuch umwandeln. Bitte vorschlagen. – manoj1123

+0

Hallo, um von Datei zu laden, benutze dieses 'data = open (" data.txt "). Read()', anstelle von 'data =" "" "" "', habe ich auch meine Antwort aktualisiert. – YOU

+0

Sehr geehrte Marke, Vielen Dank für Ihre Unterstützung und Zeit. Ich bin in der Lage, die Ausgabe zu generieren. Wie kann ich writexml() verwenden, um die Ausgabe in eine Datei zu schreiben. Danke, – manoj1123

5

Nun, könnten Sie mit

import xml.etree.ElementTree as ET 
tree = ET.parse("blah.xml") 

Find the elements Sie ändern möchten starten.

Um den Inhalt eines Elements zu ersetzen, tun nur

element.text = "TRUE" 

Die Import-Anweisung über Werke in Python 2.5 oder höher. Wenn Sie eine ältere Version von Python haben, müssen Sie ElementTree als Erweiterung installieren, und dann ist die import-Anweisung anders: .

1

Leider ist die XPath von ElementTree unterstützt nicht abgeschlossen ist. Da Python 2.6 eine ältere Version enthält, funktioniert das Suchen von Elementen nach Attribut (wie angegeben here) nicht. So Python's own documentation sollte Ihre erste Station sein: xml.etree.ElementTree

import xml.etree.ElementTree as ET 

original = ET.parse("original.xml") 
parameters = original.findall(".//Parameter") 
changes = {} 

# read changes 
with open("changes.txt", "rb") as in_file: 
    for change in in_file: 
     change = change.rstrip()    # remove line endings 
     name, value = change.split(":") 
     changes[name.strip()] = value.strip() # remove whitespaces 

# find paramter element and apply changes 
for parameter in parameters: 
    parameter_name = parameter.get("name") 
    if changes.has_key(parameter_name):     
     value = parameter.find("./Value") 
     value.text = changes[parameter_name] 
     result = parameter.find("./Result") 
     result.text = changes[parameter_name] 

original.write("new.xml") 
+0

Hallo wierob, Vielen Dank für Ihre Zeit. Da ich Python 2.3 Version aufgrund einiger WXPYTHON Constraint mit Open-Anweisung verwenden, funktioniert möglicherweise nicht. Also habe ich das notwendige Editieren gemacht. Tatsächlich zeigt das Änderungswörterbuch nur ein Element an. Auch ich bekomme Fehler Zeile parameter_name ist nicht definiert. get ("name") funktioniert wahrscheinlich nicht. – manoj1123

1

Hier ist, wie Sie es Amara

from amara import bindery 

doc = bindery.parse(XML) 

def cleanup_for_dict(key, value): 
    return key.strip(), value.strip() 

params = dict((cleanup_for_dict(*line.split(':', 1)) 
       for line in TEXT.splitlines())) 

for param in doc.ParameterData.ParameterList.Parameter: 
    if param.name in params: 
     param.Value = params[param.name] 
     param.Result = params[param.name] 

doc.xml_write() 
Verwandte Themen