2017-06-09 5 views
0

Ich versuche, mehrere element.text auf eine XML-Datei troncate. Es gelingt mir, zwei Listen zu erhalten, die erste gruppiert die Former zu lang element.text als str (long_name) und die zweite gruppiert die gleiche nach einer troncation (short_name).Wie ersetzt man einen Text in XML durch lxml?

Nun ich die element.text auf meiner xml ersetzen will, habe ich versucht, ein Skript, aber ich surrended mit der Funktion readlines() zu arbeiten, ich mag eine ähnliche Lösung mit lxml wie dieser Code zu finden:

txt = open('IF_Generic.arxml','r') 
Lines = txt.readlines() 
txt.close() 

txt = open('IF_Genericnew.arxml','w') 

for e in range(len(long_name)) : 
    for i in range(len(Lines)) : 
     if (long_name[e] in Lines[i]) == True : 
      Lines[i] = Lines[i].replace(long_name[e],short_name[e]) 

for i in Lines : 
    txt.write(i) 

txt.close() 

ich versuchte dies, aber es funktioniert nicht:

f = open('IF_Generic.arxml') 
arxml = f.read() 
f.close() 
tree = etree.parse(StringIO(arxml)) 
for e,b in enumerate(long_name) : 
    context = etree.iterparse(StringIO(arxml)) 
    for a,i in context: 
     if not i.text: 
      pass 
     else: 
      if (b in i.text) == True : 
       i.text = short_name[e] 

obj_arxml = etree.tostring(tree,pretty_print=True) 

f = open('IF_Genericnew.arxml','w') 
f.write(obj_arxml) 
f.close() 

ist das erste Element der Liste long_name ist RoutineServices_EngMGslLim_NVMID03

<BALISE_A> 
    <BALISE_B> 
     <SHORT-NAME>RoutineServices_EngMGslLim_NVMID03</SHORT-NAME> 
    </BALISE_B> 
</BALISE_A> 
<BALISE_C> 
    <POSSIBLE-ERROR-REF DEST="APPLICATION-ERROR">/Interfaces/RoutineServices_EngMGslLim_NVMID03/E_NOT_OK</POSSIBLE-ERROR-REF> 
    <SHORT-NAME>Blah_Bleh_Bluh</SHORT-NAME> 
</BALISE_C> 
Lassen sie sagen,

Das erste Element der Liste short_name ist RoutineServices_EngMGslLim_NV

<BALISE_A> 
    <BALISE_B> 
     <SHORT-NAME>RoutineServices_EngMGslLim_NV</SHORT-NAME> 
    </BALISE_B> 
</BALISE_A> 
<BALISE_C> 
    <POSSIBLE-ERROR-REF DEST="APPLICATION-ERROR">/Interfaces/RoutineServices_EngMGslLim_NV/E_NOT_OK</POSSIBLE-ERROR-REF> 
    <SHORT-NAME>Blah_Bleh_Bluh</SHORT-NAME> 
</BALISE_C> 

ich dieses

P.S will: Ich Python 2.7.9

Vielen Dank im Voraus jedem benutzen!

+0

@mzjn Um zu vereinfachen, werden wir sagen, dass ich 2 Listen habe, ich möchte alle Element.text in meinem XML durchsuchen und ersetzen. Die Liste long_name ist das Kriterium, um zu wissen, ob ich den Text ersetzen muss oder nicht, und die Liste short_name ist der neue Text, den ich einfügen möchte. Ich kann dir die XML-Datei nicht geben, weil es wie 500k Zeilen ist. – Noxos

+0

@mzjn Ich habe versucht, so minimal wie möglich zu sein – Noxos

Antwort

0

Öffnen Sie keine XML-Dateien wie Textdateien. Ich habe explained in this answer warum das eine schlechte Idee ist.

Lassen Sie einfach etree lesen und schreiben Sie die Datei. Es ist auch weniger Code zu schreiben.

Statt über alle Elemente zu gehen, das ist, was "//*" der Fall ist, können Sie spezifischere XPath verwenden, um die Elemente zu verengen Sie arbeiten möchten.

Zum Beispiel würde etwas wie "//SHORT-NAME | //POSSIBLE-ERROR-REF" helfen, die Gesamtarbeitsbelastung zu reduzieren.

+0

Ich versuche Ihre Lösung, aber ich habe diesen Fehler für die "serialisieren und schreiben Sie die Datei" Teil: 'Modul' Objekt hat kein Attribut 'schreiben' etwas fehlt? Ich muss alle Elemente überprüfen, damit ich Xpath nicht angeben kann. – Noxos

+0

Whoops, Tippfehler. Ich tippte 'etree.write (...)', aber natürlich meinte ich 'tree.write (...)'. Das ist behoben. – Tomalak

+0

das ist was ich dachte! Ich teste es. – Noxos

Verwandte Themen