user7822402
user7822402

Reputation:

TypeError: 'xml.etree.ElementTree.Element' object is not callable

I am converting to Python an application I had earlier written in C#. It's a GUI application to manage unknown words while learning a new language. When the application starts, I have to load the words from the XML file which has a pretty simple structure:

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

Nevertheless, I am getting:

/usr/bin/python3.5 /home/cali/PycharmProjects/Vocabulary/Vocabulary.py Traceback (most recent call last): File "/home/cali/PycharmProjects/Vocabulary/Vocabulary.py", line 203, in main() File "/home/cali/PycharmProjects/Vocabulary/Vocabulary.py", line 198, in main gui = Vocabulary(root) File "/home/cali/PycharmProjects/Vocabulary/Vocabulary.py", line 28, in init self.load_words() File "/home/cali/PycharmProjects/Vocabulary/Vocabulary.py", line 168, in load_words w = Word(node('Word').text, node('Explanation').text, node('Translation').text, node('Example').text) TypeError: 'xml.etree.ElementTree.Element' object is not callable

This is the original LoadWords() method:

void LoadWords()
{
    words.Clear();
    listView1.Items.Clear();
    string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    string vocabulary_path = path + "\\Vocabulary\\Words.xml";
    if (!Directory.Exists(path + "\\Vocabulary"))
        Directory.CreateDirectory(path + "\\Vocabulary");

    if (!File.Exists(vocabulary_path))
    {
        XmlTextWriter xW = new XmlTextWriter(vocabulary_path, Encoding.UTF8);
        xW.WriteStartElement("Words");
        xW.WriteEndElement();
        xW.Close();
    }
    XmlDocument xDoc = new XmlDocument();
    xDoc.Load(vocabulary_path);
    foreach (XmlNode xNode in xDoc.SelectNodes("Words/Word"))
    {
        Word w = new Word();
        w.WordOrPhrase = xNode.SelectSingleNode("Word").InnerText;
        w.Explanation = xNode.SelectSingleNode("Explanation").InnerText;
        w.Translation = xNode.SelectSingleNode("Translation").InnerText;
        w.Examples = xNode.SelectSingleNode("Examples").InnerText;
        words.Add(w);
        listView1.Items.Add(w.WordOrPhrase);
        WordCount();
    }

}

I don't know how to access each node's inner text.

Here is my load_words function:

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('Word').text, node('Explanation').text, node('Translation').text, node('Example').text)

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

Upvotes: 3

Views: 8110

Answers (1)

har07
har07

Reputation: 89285

TypeError: 'xml.etree.ElementTree.Element' object is not callable

As the error message mentioned, node is an Element, not a method which you can call/invoke like method_name(parameters) as you did in this part :

w = Word(node('Word').text, node('Explanation').text, node('Translation').text, node('Example').text)

Method that is closer to SelectSingleNode() in your C# would be Element.find(), for example, to get the first child element named Word from node and then extract the inner text :

inner_text = node.find('Word').text

And the implementation in your context code would be as follows :

w = Word(node.find('Word').text, node.find('Explanation').text, node.find('Translation').text, node.find('Example').text)

Upvotes: 2

Related Questions