我正在尝试在Python中实现SAX解析器。读取XML并创建对象。以下是我的代码。
import xml.sax
class Employee :
def __init__(self, id):
self.id = id
class EmployeeHandler(xml.sax.ContentHandler):
emp = None
emplist = []
fName = False
lName = False
age = False
company = False
def __init__(self):
xml.sax.ContentHandler.__init__(self)
def startElement(self, name, attrs):
print("startElement '" + name + "'")
if name == "Employees" :
global emplist
emplist = []
if name == "Employee":
global emp
emp = Employee(attrs.getValue("id"))
elif name == "FirstName":
global fName
fName = True
elif name == "LastName":
global lName
lName = True
elif name == "Age":
global age
age = True
elif name == "Company":
global company
company = True
def characters(self, content):
print("characters '" + content + "'")
global fName, lName, age, company
if fName is True:
emp.firstName = content
elif lName is True:
emp.lastName = content
elif age is True:
emp.age = content
elif company is True:
emp.company = content
def endElement(self, name):
print("endElement '" + name + "'")
if name == "Employee":
#global emplist : To use list methods global is not required
emplist.append(emp)
def main(sourceFileName):
source = open(sourceFileName)
xml.sax.parse(source, EmployeeHandler())
if __name__ == "__main__":
main("EmployeeData")
print("Ids ", emplist[0].id , emplist[1].id)
执行代码时,我会收到以下错误:
File "C:/Users/611834094/PycharmProjects/PractiseProject/xml_pratise/saxparser.py", line 47, in characters
if fName is True:
NameError: name 'fName' is not defined
确切地说,以下块正在引起错误:
def characters(self, content):
print("characters '" + content + "'")
global fName, lName, age, company
if fName is True:
emp.firstName = content
变量fName
(以及其他全局变量(是用一个初始值来定义的,该值在处理程序的startElement()
方法中已更改,在字符方法中,我试图比较fname对True
(boolean(的值,我收到的错误如上所述。
谢谢
我将拿一些代码的片段:
class EmployeeHandler(xml.sax.ContentHandler):
....
fName = False
....
elif name == "FirstName":
global fName
fName = True
....
global fName, lName, age, company
if fName is True:
global
关键字使fName
成为全局外部类。要使用类变量fName
,您应该以类名称为前面:
elif name == "FirstName":
EmployeeHandler.fName = True
....
if EmployeeHandler.fName is True:
说过,这些变量似乎都不适合 class 变量,似乎它们实际上应该是对象实例变量,即附加到 self
,如@jessebakker所述。他们似乎是每个员工的属性,而不是整个班级的属性。
这不起作用的原因是您没有定义任何全局变量。取而代之的是,您的类成员定义了,这些成员不是全球范围的,而是在对象中进行范围。这些可以通过自我参数访问,这是类实例:
if self.fName:
self.emp.firstName = content
etc