2

我正在使用 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>'))

没有成功。

很感谢任何形式的帮助。谢谢你。

4

1 回答 1

2

只需找到元素并附加:

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 作为 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>
于 2016-04-12T20:36:54.083 回答