1

私はおそらく何かを見落としていますが、関数「getAllElements」を持つクラス「parse」を取得しました。メインスクリプトでは、を使用して解析をインポートします

from parseXML import parse. 

それから私はします

parse = parse(file) 

これは正常に動作します。しかし、私がするとき

print parseXML.parse(file).getAllElements()

次のエラーが発生します。

NameError: global name 'getAllElements' is not defined 

以下はコードです。どこが間違っているのですか?

編集:コメント後にコードを変更しました

class parse:
    # Constructor
    def __init__(self, file):
        # parse the xml file into a tree
        tree = xml.parse('/homes/ndeklein/test.featureXML')
        # Get the root node of the xml file
        self.rootElement = tree.getroot()
        # Set self.parent to rootElement, because the first element won't have a parent (because it is the root)
        self.parent = 'rootElement'
        # dictionary that contains the parent -> child relation
        self.parentChildDict = {}

    # Go recursively through all the elements in the xml file, starting at the choosen rootElement, until only leaves (elements that don't contain elements) are left
    # Return all the elements from the xml file
    def getAllElements(self):
        # if this is the first time this parent is seen:
        #     make elementDict with parent as key and child as value in a list
        if not self.parentChildDict.has_key(self.parent):
            self.parentChildDict[self.parent] = [self.rootElement]
        # else: add the child to the parent dictionary
        else:
            self.parentChildDict[self.parent].append(self.rootElement)
        for node in self.rootElement:
            # if the len of rootElement > 0 (there are more elements in the element):
            #    set self.parent to be node and recursively call getAllElements
            if len(self.rootElement) > 0:
                self.parent = node
                getAllElements()
        return self.parentChildDict

#!/usr/bin/env python

# author: ndeklein
# date: 08/02/2012
# function: calls out the script

import parseXML
import xml.etree.cElementTree as xml
import sys

#Parse XML directly from the file path
file = '/homes/ndeklein/EP-B1.featureXML'
# parse the xml file into a tree
print parseXML.parse(file).getAllElements()
4

2 に答える 2

1

parseXMLを実行しているため、ローカル名前空間にないようですfrom parseXML import parseparseXML直接インポートして、代わりにこれを実行してみましたか?

import parseXML 
parseXML.parse(file).getAllElements()

メソッド内で呼び出すことはできないため、NameErrorが発生しますgetAllElements()。する必要がありますself.getAllElements()

コメントで述べたように、コードには修正が必要な他の論理エラーがあります。

于 2012-02-09T14:58:01.747 に答える
1

Praveenがほのめかしたように、それはあなたのインポートと呼び出しのスタイルです。

この方法でインポートするため:

from foo import bar

呼び出しでfooを明示的に宣言する必要はありません(実際にはそうすべきではありません)。

bar.baz()

いいえ

foo.bar.baz()

したがって、あなたの場合は、電話を試してください:

parse(file).getAllElements()

ただし、再帰でネイキッドコールに対処する必要があります。getAllElements()はおそらくself.getAllElements()である必要があります。

于 2012-02-09T15:02:13.257 に答える