3

我一直在研究一个分析乐谱并从中删除特定音符的项目。因此,既然我已经获得了代码所需的信息,我现在需要使用我的新信息来编辑原始 XML 分数。我在 Python 中这样做并且已经使用过 Minidom,所以我显然想坚持下去(我知道这可能是一个愚蠢的选择,因为这里的很多帖子都推荐了不同的 XML 解析方法,因为界面不太友好存在于 Minidom 中)。

所以说,在我的原始 XML 文件中,我有一首仅由 10 个音符组成的乐曲。笔记的 XML 格式如下所示:

<note>
  <pitch>
    <step>E</step>
    <alter>-1</alter>
    <octave>5</octave>
  </pitch>
  <duration>72</duration>
</note>

因此,对于每个音符值,这将重复 10 次。现在我已经完成了分析,我想删除其中的 5 个注释。删除是指用休止符替换(因为它毕竟是乐谱并且它具有符合的形状)。因此,XML 文件中的 rest 格式如下所示:

<note>
    <rest/>
    <duration>72</duration>
</note>

所以我所要做的就是删除音高标签并用休息标签替换它。但是我不确定如何解决这个问题,从我的搜索中并没有真正找到任何看起来相似的东西。

我不太担心找到要删除的注释在哪里,因为我已经编写了一个快速测试工具来展示我将如何在 Python 中进行下面的操作(xml_format 本质上只是一个包含我的新信息的字典列表)。它包含与原始 XML 文件相同数量的注释,唯一的区别是其中一些现在被标记为删除。所以原始文件可能有如下注释:G、Bb、D、C、G、F、G、D、Bb 和 xml_format 将有 G、Bb、D、REMOVE、G、REMOVE、G、D、Bb 等。

我刚刚返回了一个,以确保删除了正确数量的笔记。

def remove_notes(xml_format, filename):

doc = minidom.parse(filename)                 
count = 0
a = 0
note = doc.getElementsByTagName("note")  

for item in note:
    if xml_format[count]['step'] == 'Remove':
        a = a + 1
        # THEN REMOVE THE ENTIRE PITCH TAG, REPLACE WITH REST
    count = count + 1
    # ELSE DON'T DO ANYTHING

return a 

所以基本上我只是在寻找一些语法或代码的帮助,可用于在特定点删除特定节点,然后用新节点替换,然后再写入新文件。非常感谢您的帮助,我希望这是可能的(逻辑似乎并不复杂,但谁知道什么是可能的)!

4

1 回答 1

0

您需要为每个<note>节点做的是:

  1. 创建一个新<rest/>节点
  2. 定位<pitch>节点
  3. <pitch>用新<rest/>节点替换节点

这是代码:

def remove_notes(xml_format, filename):
    doc = minidom.parse(filename)                 
    count = 0
    a = 0
    note_nodes = doc.getElementsByTagName("note")  

    for note_node in note_nodes:
        if xml_format[count]['step'] == 'Remove':
            a = a + 1

            # Create a <rest/> node
            rest_node = note_node.ownerDocument.createElement('rest')

            # Locate the <pitch> node
            pitch_node = note_node.getElementsByTagName('pitch')[0]

            # Replace pitch with rest
            note_node.replaceChild(rest_node, pitch_node)

        count = count + 1
        # ELSE DON'T DO ANYTHING

    # Finished with the loop, doc now contains the replaced nodes, we need
    # to write it to a file    

    return a 

请注意,您需要将更改写入新文件,否则您的更改将丢失。

于 2014-02-18T22:19:50.453 回答