使用 python 解析 XML 抛出异常

问题描述 投票:0回答:1

完成 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 xml
1个回答
0
投票

您的代码在 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!
© www.soinside.com 2019 - 2024. All rights reserved.