Как добавить новый элемент в дерево musicXML в Python (elementtree)?
Я использую Python для пакетного редактирования многих файлов musicXML, которые в настоящее время выглядят так:
<score-partwise>
...
<attributes>
<transpose>
<diatonic>-5</diatonic>
<chromatic>-9</chromatic>
</transpose>
</attributes>
...
</score-partwise>
Как я могу добавить <octave-change>-1</octave-change>
в <transpose></transpose>
как ниже?
<score-partwise>
...
<attributes>
<transpose>
<diatonic>-5</diatonic>
<chromatic>-9</chromatic>
<octave-change>-1</octave-change>
</transpose>
</attributes>
...
</score-partwise>
Я попытался это:
import xml.etree.ElementTree as ET
attributes = ET.Element("attributes")
attributes.append(ET.fromstring('<transpose><octave-change>-1</octave-change></transpose>'))
безуспешно.
Любая помощь очень ценится. Спасибо.
1 ответ
Решение
Просто найдите элемент и добавьте:
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))
Что дает вам:
<score-partwise>
<attributes>
<transpose>
<diatonic>-5</diatonic>
<chromatic>-9</chromatic>
</transpose>
<transpose><octave-change>-1</octave-change></transpose></attributes>
</score-partwise>
Это также добавляет новый элемент транспонирования, если вы просто хотите добавить к существующему элементу транспонирования, выберите его.
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))
Что дает вам:
<score-partwise>
<attributes>
<transpose>
<diatonic>-5</diatonic>
<chromatic>-9</chromatic>
<octave-change>-1</octave-change></transpose>
</attributes>
</score-partwise>
Вы также можете использовать SubElement, который позволяет получить доступ к узлу:
xml = et.fromstring(x)
print(et.tostring(xml))
e = et.SubElement(xml.find(".//attributes/transpose"), "octave-change")
e.text = "-1"
e.tail= "\n"
Если вы хотите отформатировать, вам может пригодиться lxml:
импортировать lxml.etree as 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)
Который напишет:
<score-partwise>
<attributes>
<transpose>
<diatonic>-5</diatonic>
<chromatic>-9</chromatic>
<octave-change>-1</octave-change>
</transpose>
</attributes>
</score-partwise>