首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python (元素树)中向musicXML树添加一个新元素?

如何在Python (元素树)中向musicXML树添加一个新元素?
EN

Stack Overflow用户
提问于 2016-04-12 20:29:21
回答 1查看 364关注 0票数 2

我正在使用Python对许多musicXML文件进行批量编辑,这些文件目前如下所示:

代码语言:javascript
复制
    <score-partwise>
    ...
      <attributes>
        <transpose>
          <diatonic>-5</diatonic>
          <chromatic>-9</chromatic>
          </transpose>
        </attributes>
    ...
      </score-partwise>

如何在<octave-change>-1</octave-change>中添加<transpose></transpose>,如下所示?

代码语言:javascript
复制
    <score-partwise>
    ...
      <attributes>
        <transpose>
          <diatonic>-5</diatonic>
          <chromatic>-9</chromatic>
          <octave-change>-1</octave-change>
          </transpose>
        </attributes>
    ...
      </score-partwise>

我尝试过这样做:

代码语言:javascript
复制
import xml.etree.ElementTree as ET

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

但没有成功。

任何帮助都是非常感谢的。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-12 20:36:54

只需找到元素并追加:

代码语言:javascript
复制
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))

这给了你:

代码语言:javascript
复制
<score-partwise>
      <attributes>
        <transpose>
          <diatonic>-5</diatonic>
          <chromatic>-9</chromatic>
          </transpose>
        <transpose><octave-change>-1</octave-change></transpose></attributes>
</score-partwise>

这还添加了一个新的transpose元素,如果您只想附加到现有的transpose元素,那么选择它。

代码语言:javascript
复制
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))

这给了你:

代码语言:javascript
复制
<score-partwise>
      <attributes>
        <transpose>
          <diatonic>-5</diatonic>
          <chromatic>-9</chromatic>
          <octave-change>-1</octave-change></transpose>
        </attributes>
</score-partwise>

还可以使用SubElement,它允许您访问节点:

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

上面写着:

代码语言:javascript
复制
<score-partwise>
  <attributes>
    <transpose>
      <diatonic>-5</diatonic>
      <chromatic>-9</chromatic>
      <octave-change>-1</octave-change>
    </transpose>
  </attributes>
</score-partwise>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36583459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档