完成 XMLReader 类,我们将 XML 文档作为字符串传递给构造函数,它将 XML 文档转换为动态对象,其中节点可作为对象的属性访问,内部 XML 可通过文本属性访问。
完成该类,以便它可以递归地用于任何级别的 XML。
xml_string = "<note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> "
这里我的
xml_string
是动态的,可以更改并具有不同的项目和标签。
这是我的代码:
import xml.etree.ElementTree as ET
class XmlReader:
def __init__(self, xml=None):
self.tree = tree = ET.ElementTree(ET.fromstring(xml))
self.root = tree.getroot()
def parse_xml(self):
for elem in self.root.iter():
print(ET.tostring(elem).decode('utf8'))
if elem.text != None:
print(elem.text+'\n')
else:
print('None') # catch empty nodes like <body />
if __name__ == "__main__":
xml_string = """<?xml version="1.0" encoding="utf-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>"""
xmlObj = XmlReader(xml_string)
xmlObj.parse_xml()
这是在线考试时问到的,当我使用此代码时,它说发生了异常,但网站没有显示异常。
我的代码可能有什么问题?
Python版本是3.11,我们如何使用递归方法解决这个问题。
您的代码在 python 3.11 中运行,没有错误消息,因此您的错误必须来自另一次检查。你可以使用yield来解析递归:
import xml.etree.ElementTree as ET
class XmlReader:
def __init__(self, xml=None):
try:
# Check the tree first if it's valid
self.root = ET.fromstring(xml)
print(15*'#'+' valid tree')
ET.indent(self.root, space = ' ')
ET.dump(self.root)
print(25*'#')
except ET.ParseError as err:
print(err)
def parse_xml(self):
for child in self.root:
yield child.text
if __name__ == "__main__":
xml_string = """<?xml version="1.0" encoding="utf-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>"""
xmlObj = XmlReader(xml_string)
for x in xmlObj.parse_xml():
print(x)
输出:
############### valid tree
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
#########################
Tove
Jani
Reminder
Don't forget me this weekend!