我一直在做一个项目,分析乐谱并从中删除特定的音符。因此,现在我已经从代码中获得了所需的信息,我现在需要用新信息编辑原始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、BbD、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
因此,基本上,我只是在寻找语法或代码方面的一些帮助,这些语法或代码可以用于在特定点删除特定节点,然后在写入新文件之前用新节点替换。非常感谢您的帮助,我希望这是可能的(逻辑似乎并不复杂,但谁知道什么是可能的)!
您需要为每个<note>
节点做的是:
- 创建新的
<rest/>
节点 - 找到
<pitch>
节点 - 将
<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
请注意,您需要将更改写入新文件,否则您的更改将丢失。