2017-04-13 11 views
0

新しい言語を学習しながら未知語を管理する簡単なGUIアプリケーションを作成しています。単語は、XMLドキュメントに/から保存/ロードされますが、ここではそれがどのように見えるかですされています私のアプリケーションで人間が読めないXMLが生成される

<Words><Word><Word>test1</Word><Explanation>test1</Explanation><Translation>test1</Translation><Examples>test1</Examples></Word><Word><Word>test2</Word><Explanation>test2</Explanation><Translation>test2</Translation><Examples>test2</Examples></Word><Word><Word>test3</Word><Explanation>test3</Explanation><Translation>test3</Translation><Examples>test3</Examples></Word><Word><Word>test4</Word><Explanation>test4</Explanation><Translation>test4</Translation><Examples>test4</Examples></Word><Word><Word>test5</Word><Explanation>test5</Explanation><Translation>test5</Translation><Examples>test5</Examples></Word></Words> 

すべてが1行であり、それは次のようにする必要があります:

<Words> 
    <Word> 
     <Word>test</Word> 
     <Explanation>test</Explanation> 
     <Translation>test</Translation> 
     <Examples>test</Examples> 
    </Word> 
</Words> 

私は何をしています間違っている?

# Vocabulary.py 
# GUI program to manage unknown words 

from tkinter import * 
from tkinter import ttk 
from tkinter import messagebox 
import xml.etree.ElementTree as ET 
import os 


class Word: 

    def __init__(self, wordorphrase, explanation, translation, example): 
     self.wordorphrase = wordorphrase 
     self.explanation = explanation 
     self.example = example 
     self.translation = translation 

class Vocabulary(Frame): 

    def __init__(self, master): 
     Frame.__init__(self, master) 
     self.master = master 
     self.master.resizable(width = False, height = False) 
     self.master.title("Vocabulary") 
     self.create_widgets() 
     self.words = [] 
     self.load_words() 

    def on_closing(self): 

     self.save_all() 

     if messagebox.askokcancel("Quit", "Do you want to quit?"): 
      self.master.destroy() 

    def create_widgets(self): 

     self.buttons_frame = Frame(self.master) 
     self.buttons_frame.grid(row = 10, sticky = W) 

     self.search_frame = Frame(self.master) 
     self.search_frame.grid(row = 1, sticky = W, columnspan = 2) 

     self.comboBox = ttk.Combobox(self.search_frame, 
            width = 3) 
     self.comboBox.grid(row = 0, column = 14, sticky = W) 
     self.comboBox['values'] = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z') 

     self.btn_Add = Button(self.buttons_frame, 
           text = 'Add', 
           command = self.add_item) 
     self.btn_Add.grid(row = 0, sticky = W) 

     self.btn_Remove = Button(self.buttons_frame, 
           text = 'Remove', 
           command = self.remove_item) 

     self.btn_Remove.grid(row = 0, column = 1, sticky = W) 

     self.btn_Edit = Button(self.buttons_frame, 
           text = 'Edit', 
           command = self.edit_item) 
     self.btn_Edit.grid(row = 0, column = 2, sticky = W) 

     self.btn_Save = Button(self.buttons_frame, 
           text = 'Save', 
           command = self.save_item) 
     self.btn_Save.grid(row = 0, column = 3, sticky = W) 

     self.btn_Refresh = Button(self.buttons_frame, 
            text = 'Refresh', 
            command = self.refresh_all) 
     self.btn_Refresh.grid(row = 0, column = 4, sticky = W) 

     self.lblSearch = Label(self.search_frame, text = 'SEARCH: ') 
     self.lblSearch.grid(row = 0, column = 5, sticky = W) 

     self.txt_Search = Text(self.search_frame, 
           height = 1, 
           width = 70) 
     self.txt_Search.grid(row = 0, column = 6, columnspan = 3, sticky = W) 

     self.lblWordsOrPhrases = Label(self.master, text = 'WORDS/PHRASES:') 
     self.lblWordsOrPhrases.grid(row = 2, column = 0) 

     self.lblWordOrPhrase = Label(self.master, text = 'Word or phrase:') 
     self.lblWordOrPhrase.grid(row = 2, column = 1, sticky = W) 

     self.listBox = Listbox(self.master, 
           selectmode='multiple', 
           height = 34, 
           width = 38) 
     self.listBox.grid(row = 3, column = 0, rowspan = 7, sticky = W) 

     self.txt_WordOrPhrase = Text(self.master, 
            height = 1, 
            width = 40) 
     self.txt_WordOrPhrase.grid(row = 3, column = 1, sticky = N) 

     self.lblExplanation = Label(self.master, text = 'Explanation:') 
     self.lblExplanation.grid(row = 4, column = 1, sticky = W) 

     self.txt_Explanation = Text(self.master, 
            height = 10, 
            width = 40) 
     self.txt_Explanation.grid(row = 5, column = 1, sticky = N) 

     self.lblTranslation = Label(self.master, text = 'Translation:') 
     self.lblTranslation.grid(row = 6, column = 1, sticky = W) 

     self.txt_Translation = Text(self.master, 
            height = 10, 
            width = 40) 
     self.txt_Translation.grid(row = 7, column = 1, sticky = N) 

     self.lblExamples = Label(self.master, text = 'Example(s):') 
     self.lblExamples.grid(row = 8, column = 1, sticky = W) 

     self.txt_Example = Text(self.master, 
           height = 10, 
           width = 40) 
     self.txt_Example.grid(row = 9, column = 1, sticky = S) 

    def load_words(self): 

     self.listBox.delete(0, END) 
     self.words.clear() 

     path = os.path.expanduser('~/Desktop') 
     vocabulary = os.path.join(path, 'Vocabulary', 'Words.xml') 

     if not os.path.exists(vocabulary): 
      if not os.path.exists(os.path.dirname(vocabulary)): 
       os.mkdir(os.path.dirname(vocabulary)) 
      doc = ET.Element('Words') 
      tree = ET.ElementTree(doc) 
      tree.write(vocabulary) 
     else: 
      tree = ET.ElementTree(file=vocabulary) 

     for node in tree.findall('Word'): 
      w = Word(node.find('Word').text, node.find('Explanation').text, node.find('Translation').text, 
        node.find('Examples').text) 

      self.words.append(w) 
      self.listBox.insert(END, w.wordorphrase) 

    def save_all(self): 

     path = os.path.expanduser('~/Desktop') 
     vocabulary = os.path.join(path, 'Vocabulary', 'Words.xml') 

     tree = ET.ElementTree(file=vocabulary) 

     for xNode in tree.getroot().findall('Word'): 
      tree.getroot().remove(xNode) 

     for w in self.words: 
      xTop = ET.Element('Word') 
      xWord = ET.Element('Word') 
      xExplanation = ET.Element('Explanation') 
      xTranslation = ET.Element('Translation') 
      xExamples = ET.Element('Examples') 

      xWord.text = w.wordorphrase 
      xExplanation.text = w.explanation 
      xTranslation.text = w.translation 
      xExamples.text = w.example 

      xTop.append(xWord) 
      xTop.append(xExplanation) 
      xTop.append(xTranslation) 
      xTop.append(xExamples) 

      tree.getroot().append(xTop) 

     tree.write(vocabulary) 

    def add_item(self): 

     w = Word(self.get_word(), self.get_explanation(), self.get_translation(), self.get_example()) 

     self.words.append(w) 

     self.listBox.insert(END, w.wordorphrase) 

     self.clear_all() 

     self.save_all() 

    def remove_item(self): 
     word = self.listBox.get(ACTIVE) 
     new_word_list = [] # initialize empty list 
     delete_idxs = [] 
     for idx, item in enumerate(self.words): 
      if item.wordorphrase == word: 
       delete_idxs.append(idx) 
      else: 
       new_word_list.append(item) 
     self.words = new_word_list # overwrite the old word_list with the new one 
     for idx in reversed(delete_idxs): 
      self.listBox.delete(idx) 

    def edit_item(self): 
     pass 

    def save_item(self): 
     pass 

    def clear_all(self): 
     self.txt_WordOrPhrase.delete('1.0', END) 
     self.txt_Explanation.delete('1.0', END) 
     self.txt_Translation.delete('1.0', END) 
     self.txt_Example.delete('1.0', END) 

    def refresh_all(self): 
     pass 

    def get_word(self): 
     return self.txt_WordOrPhrase.get('1.0', '1.0 lineend') 

    def get_explanation(self): 
     return self.txt_Explanation.get('1.0', '1.0 lineend') 

    def get_translation(self): 
     return self.txt_Translation.get('1.0', '1.0 lineend') 

    def get_example(self): 
     return self.txt_Example.get('1.0', '1.0 lineend') 

    def find_word(word): 
     for x in self.words: 
      if x.wordorphrase == word: 
       return x 


def main(): 
    root = Tk() 
    gui = Vocabulary(root) 
    root.protocol('WM_DELETE_WINDOW', gui.on_closing) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 
+0

をそれは奇妙に思えます''の中に ''があります。 2つの異なることを意味する単一のタグ「」があります。それは意図的なのでしょうか?これはあなたが経験している問題とは無関係ですが、タグがユニークであればデータを解析しやすくなります(例: ' ...') –

+0

ええ、それは認めなければなりません。私は別の何かを考える必要があります。 –

答えて

0

あなただけET.Elementを使用します。

は、ここでは、コードです。 ET.SubElementの使用を試みます。

お役立ちリンク:たとえばhttps://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement

あなたのコード上:

xTop = ET.Element('Word') 
xWord = ET.Element('Word') 
xExplanation = ET.Element('Explanation') 
xTranslation = ET.Element('Translation') 
xExamples = ET.Element('Examples') 

私は変更しよう:

Words field: words = ET.Element('Words') 

xTop = ET.SubElement(words,'Word') 
xWord = ET.SubElement(xTop,'Word') 
xExplanation = ET.SubElement(xTop,'Explanation') 
xTranslation = ET.SubElement(xTop,'Translation') 
xExamples = ET.SubElement(xTop,'Examples') 

別の有用なリンク:https://pymotw.com/2/xml/etree/ElementTree/create.html#pretty-printing-xml

+0

私のコードで実装を表示してください。 –

+0

回答欄に例を追加しました。がんばろう! *私は変更のためにこのリファレンスを使用します:https://docs.python.org/2/library/xml.etree.elementtree.html#building-xml-documents –

+0

何も変わらず、 'Words field:words = ET.Element( '言葉') '? –

関連する問題