ElementTree.tostring(tree)报错,改用getroot()正常,求原因解析
解决xml.etree.ElementTree中ET.tostring()报AttributeError的问题
你完全猜对了!这个报错的核心原因就是**ET.parse()返回的是ElementTree对象,而ET.tostring()要求传入的是Element对象**,两者的职责和结构有着本质区别:
ElementTree是整个XML文档的树结构容器:当你用ET.parse()解析文件时,得到的tree对象代表完整的XML文档,它负责管理整个文档的结构,但本身并不是具体的XML节点,所以没有tag属性——而ET.tostring()内部会尝试访问传入对象的tag属性来处理XML节点的序列化,这就是触发AttributeError: 'ElementTree' object has no attribute 'tag'的直接原因。Element才是XML文档中的具体节点:不管是根节点还是子节点,每个Element都包含tag、属性、子节点等XML节点的核心信息,这正是ET.tostring()方法处理的目标对象。
回到你的代码:
原代码中xml_str = ET.tostring(tree)把整个文档容器传给了tostring,自然不符合方法要求;而tree.getroot()会从ElementTree中提取出XML文档的根Element节点,将这个节点传入tostring,就能正确把根节点及其所有子节点序列化为XML字符串,这也是你修改后代码正常运行的原因。
小补充:如果是用ET.fromstring(xml_str)从字符串解析XML,返回的直接就是根Element对象,这时候可以直接传给ET.tostring(),不需要额外调用getroot()。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

