2014-02-12 116 views
3

我一直在研究分析樂譜並從中刪除特定註釋的項目。所以,現在我有了我的代碼所需的信息,現在我需要用我的新信息編輯原始XML分數。我在Python中這樣做,並已使用Minidom,所以我顯然想堅持(我知道這可能是一個愚蠢的選擇,因爲這裏的很多帖子建議不同的XML解析方法,由於不太友好的界面目前在Minidom)。刪除和替換XML文件中的特定節點

所以,在我原來的XML文件中說,我有一個只有10個音符組成的音樂作品。註釋的XML格式如下所示:

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

因此,對於每個音符值,這將重複10次。現在我已經完成了我的分析,我想刪除這些註釋中的5個。通過刪除我的意思是取代休息(因爲它畢竟是一個樂譜,它有一個符合的形狀)。所以對於一個XML文件中的其餘部分的格式如下:

<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 

所以基本上我只是在尋找可用於在特定點刪除特定的節點,然後用一個新的節點所替代,被寫入到之前的那種語法或代碼的一些援助新文件。非常感謝你的幫助,我希望這是可能的(邏輯看起來不復雜,但誰知道什麼是可能的)!

回答

0

你需要爲每個<note>節點做的是:

  1. 創建一個新的<rest/>節點
  2. 找到<pitch>節點
  3. <rest/>節點
更換 <pitch>節點

這裏是代碼:

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 

請注意,您需要將更改寫入新文件,否則您的更改將會丟失。