2016-04-12 7 views
2

Ich verwende Python zu Batch-Bearbeitung viele MusicXML-Dateien, die zur Zeit wie folgt aussehen:Wie füge ich ein neues Element zu einem musicXML-Baum in Python (elementtree) hinzu?

<score-partwise> 
    ... 
     <attributes> 
     <transpose> 
      <diatonic>-5</diatonic> 
      <chromatic>-9</chromatic> 
      </transpose> 
     </attributes> 
    ... 
     </score-partwise> 

Wie kann ich <octave-change>-1</octave-change> in <transpose></transpose>, wie unten hinzufügen?

import xml.etree.ElementTree as ET 

attributes = ET.Element("attributes") 
attributes.append(ET.fromstring('<transpose><octave-change>-1</octave-change></transpose>')) 

ohne Erfolg:

<score-partwise> 
    ... 
     <attributes> 
     <transpose> 
      <diatonic>-5</diatonic> 
      <chromatic>-9</chromatic> 
      <octave-change>-1</octave-change> 
      </transpose> 
     </attributes> 
    ... 
     </score-partwise> 

Ich habe dies versucht.

Jede Hilfe wird sehr geschätzt. Vielen Dank.

+0

Es wäre hilfreich, um zu sehen, was Ausgabe von laufenden Code erzeugt wird, was zu erwarten war, und vielleicht ein kleines Beispiel so können andere Reproduzieren Sie Ihr Problem. – theWanderer4865

+0

@ theWanderer4865 Sobald ich den vollen Code funktioniere, werde ich die Frage mit dem vollen Code aktualisieren. Das Ziel des Programms ist es, bestimmte Felder von Metadaten in hunderten von musicXML-Dateien gleichzeitig zu ändern. Wenn also 100 Dateien in einem Verzeichnis für die "Flöte" stehen, kann der Benutzer dieses Programm verwenden, um die relevanten XML-Metadaten für das gewünschte Zielinstrument, z. B. "Oboe", zu ändern. Letztendlich schreibt das Programm neue Dateien. Der obige Code ist nur ein Teil des vollständigen Programms. –

Antwort

2

einfach das Element finden und hängen:

x = """<score-partwise>  
     <attributes> 
     <transpose> 
      <diatonic>-5</diatonic> 
      <chromatic>-9</chromatic> 
      </transpose> 
     </attributes>  
     </score-partwise>""" 

import xml.etree.ElementTree as et 
xml = et.fromstring(x) 

# 
xml.find("attributes").append(et.fromstring('<transpose><octave-change>-1</octave-change></transpose>')) 

print(et.tostring(xml)) 

Was gibt Ihnen:

<score-partwise> 
     <attributes> 
     <transpose> 
      <diatonic>-5</diatonic> 
      <chromatic>-9</chromatic> 
      </transpose> 
     <transpose><octave-change>-1</octave-change></transpose></attributes> 
</score-partwise> 

, die auch ein neues transponieren Element hinzufügt, wenn Sie gerade Element transponieren an das bestehende anhängen wollen, dann wählen Sie Das.

import xml.etree.ElementTree as et 

xml = et.fromstring(x) 


xml.find(".//attributes/transpose").append(et.fromstring('<octave-change>-1</octave-change>')) 

print(et.tostring(xml)) 

Welche gibt Ihnen:

<score-partwise> 
     <attributes> 
     <transpose> 
      <diatonic>-5</diatonic> 
      <chromatic>-9</chromatic> 
      <octave-change>-1</octave-change></transpose> 
     </attributes> 
</score-partwise> 

Sie können auch SubElement verwenden, die Sie den Knoten zugreifen können:

xml = et.fromstring(x) 

print(et.tostring(xml)) 
e = et.SubElement(xml.find(".//attributes/transpose"), "octave-change") 
e.text = "-1" 
e.tail= "\n" 

Wenn Sie die Formatierung möchten, können Sie lxml finden um eine bessere Option zu sein:

impo rt lxml.etree wie et

parser = et.XMLParser(remove_blank_text=True) 
xml = et.parse("test.xml",parser) 


xml.find(".//attributes/transpose").append(et.fromstring('<octave-change>-1</octave-change>')) 
xml.write('test.xml', pretty_print=True) 

Welche schreibt:

<score-partwise> 
    <attributes> 
    <transpose> 
     <diatonic>-5</diatonic> 
     <chromatic>-9</chromatic> 
     <octave-change>-1</octave-change> 
    </transpose> 
    </attributes> 
</score-partwise> 
+0

Anstatt "xml.find" zu verwenden, wobei "xml" die Variable ist, die Sie mit Text aus dem Dokument selbst definiert haben, könnte ich 'tree.find (" .// attributes/transpose ") verwenden. Append (et.fromstring (' -1 ')) wo 'tree = ET.parse (i)' und 'i' ist jede Datei in einem Verzeichnis, auf das mit einer for-Schleife zugegriffen wird? –

+0

Lassen Sie mich es selbst versuchen und ich melde mich zurück :) –

+0

'tree.find (" .// attributes/transpose "). Append (et.fromstring (' -1 ')) 'funktioniert in der Tat, wie' Baum' in meinem ersten Kommentar definiert ist. Danke für deine Hilfe Padraic. –