使用appJar展示XML树形视图时遇TypeError错误求助
解决appJar addTree()无法识别ElementTree对象的问题
你猜的完全没错!问题核心在于appJar的addTree()方法并不接受ElementTree对象作为输入——它需要的是原始的XML字符串(或bytes格式的XML数据)。从错误栈能看到,内部调用的parseString(data)函数期望的是字符串/bytes类型,而不是你传入的ElementTree实例,这才触发了TypeError: a bytes-like object is required, not 'ElementTree'。
解决步骤:将ElementTree转换为XML字符串
你需要用ElementTree.tostring()方法把xmltree对象序列化回XML字符串,再传给addTree()。这里有两种编码处理方式可选:
- 使用
encoding='utf-8'会返回bytes类型,需要额外调用.decode('utf-8')转换成字符串; - 直接用
encoding='unicode'(Python3中等价于自动解码的utf-8),可以直接得到字符串。
修改你的代码如下:
import xml.etree.ElementTree as et from appJar import gui # 保留你原有的XML构造逻辑 xml = et.Element(root) print(xml) for ele in valList: reg = et.SubElement(xml, ele.find('Name').text) bitroot = ele.findall('Bit') for bit in bitroot: et.SubElement(reg, bit.find('Name').text) xmltree = et.ElementTree(xml) # 新增:将ElementTree转换为XML字符串 xml_str = et.tostring(xmltree.getroot(), encoding='unicode', xml_declaration=True) # 后续appJar代码不变,仅替换传入的参数为转换后的字符串 app = gui() app.startFrame('bottomleft',1,0,2) app.setBg('orange') app.setSticky('news') app.setStretch('none') app.addTree('REGISTER', xml_str) # 这里传入xml_str而非xmltree app.go()
补充说明
addTree()内部依赖XML DOM解析器处理输入,因此它需要直接的XML文本内容,而非已经解析完成的ElementTree对象。通过tostring()把ElementTree序列化回XML格式,就能完美匹配接口的参数要求了。
如果遇到编码相关问题,你可以调整tostring()的参数:比如去掉xml_declaration=True(若不需要XML声明),或者用utf-8编码后手动解码:
xml_bytes = et.tostring(xmltree.getroot(), encoding='utf-8', xml_declaration=True) xml_str = xml_bytes.decode('utf-8')
内容的提问来源于stack exchange,提问作者Durgesh Ranjan
相关产品推荐
相关产品推荐

