python - 安装的 lxml 在使用另一个函数时会导致 TypeError
问题描述
所以我有这段代码(没有安装 lxml)按预期工作
from xml.etree.ElementTree import Element, tostring
from xmljson import badgerfish as bf
dic = {'p': {'@id': 'main'}}
output = bf.etree(dic, root=Element('root'))
print(tostring(output).decode('utf-8'))
输出是
<root><p id="main" /></root>
问题是我需要 lxml 来完成另一个任务,但是如果我安装它(通过 pip install lxml),上面的代码会产生这个错误
TypeError: append() argument must be xml.etree.ElementTree.Element, not lxml.etree._Element
那么如何将上面的代码与 lxml 一起使用呢?
完整的堆栈跟踪:
TypeError Traceback (most recent call last)
<ipython-input-1-7478b75b9581> in <module>
4 dic = {'p': {'@id': 'main'}}
5
----> 6 output = bf.etree(dic, root=Element('root'))
7 print(tostring(output).decode('utf-8'))
~/.local/lib/python3.7/site-packages/xmljson/__init__.py in etree(self, data, root)
132 if elem is None:
133 continue
--> 134 result.append(elem)
135 # Treat scalars as text content, not children (Parker)
136 if not isinstance(value, (self.dict, dict, self.list, list)):
TypeError: append() argument must be xml.etree.ElementTree.Element, not lxml.etree._Element
解决方案
正如@jordanm 建议的那样,我必须将 lxml 元素传递给 bf.etree() 而不是 xml.etree 元素,所以工作代码是
from lxml.etree import Element as EElement
from xml.etree.ElementTree import Element, tostring
from xmljson import badgerfish as bf
dic = {'p': {'@id': 'main'}}
output = bf.etree(dic, root=EElement('root'))
print(tostring(output).decode('utf-8'))
产生正确的输出
<root><p id="main" /></root>
推荐阅读
- c++ - 指针和数据类型
- php - Fedex 是否提供折扣运费?
- typescript - 打字稿:如何用 Tslint 禁止等待?
- symfony - Symfony 3:如何嵌入表单集合 - 提交后我在数组中只有一个元素而不是很多
- javascript - 在 Heroku 后期构建期间,找不到文件
- reactjs - 有什么方法可以使用材质 UI 根据文本字段名称呈现图标?
- javascript - 如何将 hasOwnProperty 与 AngularJS 指令`attrs` 对象一起使用
- rust - 我可以强制一个特征是协变的吗?
- sql - 使用从 CASE 语句返回的相同值填充整个列
- android - google api java客户端在使用proguard-android-optimize.txt时未传递值为0的参数