将列表项保存到XML文档中

时间:2017-04-13 05:14:34

标签: c# python xml list

我有一个用C#编写的应用程序,我需要转换为Python,因为我最近已切换到Linux。这是一个简单的GUI应用程序,用于在学习新语言(词汇表)时管理未知单词。然而,当应用程序关闭时,它应该将列表中的每个项目保存到XML文档中。

在C#中,我将创建以下方法:

void SaveAll()
{

    XmlDocument xDoc = new XmlDocument();

    string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    string vocabulary_path = path + "\\Vocabulary\\Words.xml";

    xDoc.Load(vocabulary_path);
    XmlNode xNode = xDoc.SelectSingleNode("Words");
    xNode.RemoveAll();
    foreach (Word w in words)
    {
        XmlNode xTop = xDoc.CreateElement("Word");
        XmlNode xWord = xDoc.CreateElement("Word");
        XmlNode xExplanation = xDoc.CreateElement("Explanation");
        XmlNode xTranslation = xDoc.CreateElement("Translation");
        XmlNode xExamples = xDoc.CreateElement("Examples");

        xWord.InnerText = w.WordOrPhrase;
        xExplanation.InnerText = w.Explanation;
        xTranslation.InnerText = w.Translation;
        xExamples.InnerText = w.Examples;
        xTop.AppendChild(xWord);
        xTop.AppendChild(xExplanation);
        xTop.AppendChild(xTranslation);
        xTop.AppendChild(xExamples);
        xDoc.DocumentElement.AppendChild(xTop);
    }

    xDoc.Save(vocabulary_path);
    Sync();

}

...但我担心我在Python中编写的代码的有效性。问题是列表元素根本就没有保存。另外,我得到了:

  

/usr/bin/python3.5 /home/cali/PycharmProjects/Vocabulary/Vocabulary.py   Tkinter回调中的异常回溯(最近一次调用最后一次):
  在电话中输入文件“/usr/lib/python3.5/tkinter/init.py”,第1553行       return self.func(* args)File“/home/cali/PycharmProjects/Vocabulary/Vocabulary.py”,第140行,in   新增项目       self.save_all()文件“/home/cali/PycharmProjects/Vocabulary/Vocabulary.py”,第202行,in   保存全部       tree.append(xTop)AttributeError:'ElementTree'对象没有属性'append'

     

处理完成,退出代码为0

...当我执行add_item()函数时,其中包含save_all()函数。

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.findall('Words'):
        tree.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.append(xTop)

Python与xDoc.Save(vocabulary_path)的等效内容是什么?

什么是Python相当于xDoc.DocumentElement.AppendChild(xTop)

我正在使用Python 3.5。

1 个答案:

答案 0 :(得分:0)

您可以使用write()方法将ElementTree保存到文件中,因此与您的C#xDoc.Save(vocabulary_path)相同的是:

tree.write(vocabulary_path)

此外,以下代码段意味着将xTop附加到根元素:

xDoc.DocumentElement.AppendChild(xTop);

所以Python中的等价物是:

tree.getroot().append(xTop)