将XML元素从Oracle数据库传递到ElementTree(Python XML解析器)时出现问题



我想从数据库中获取一个XML文件,用ElementTree对其进行操作,然后将其插入另一个数据库中。获取文件很好,我可以完整打印它。然而,每当我试图让它通过解析器时,它都会返回错误";没有找到元素";。

这是代码:

import cx_Oracle
import xml.etree.ElementTree as et
cx_Oracle.init_oracle_client(lib_dir=r"here and there")
try:
dsn_tns_source = cx_Oracle.makedsn('censored for obvious reasons')
con_source = cx_Oracle.connect(cx_Oracle.makedsn('same here'))
except cx_Oracle.DatabaseError as err:
print("Connection DB error:", err)

try:
cur_source = con_source.cursor()
source_select = cur_source.execute("working SELECT")
print(source_select)
for row in source_select:
x = row[(len(row) - 1)]  # This is the XML
print("source_row: ", x)
tree = et.parse(x)
root = tree.getroot()
print(root)
print(et.tostring(root, encoding='utf-8').decode('utf-8'))
for col in cur_source.description:
print("source_col: ", col)

显然我没有通过";x〃;然而,正确地说,在调用该变量时,整个XML应该在该变量中得到帮助。大多数教程只展示了如何插入本地文件,所以我认为简单地使用该变量就足够了。错误消息如下:

Traceback (most recent call last):
File "Z:basler_benchmarkmain.py", line 24, in <module>
tree = et.parse(x)
File "C:PythonlibxmletreeElementTree.py", line 1229, in parse
tree.parse(source, parser)
File "C:PythonlibxmletreeElementTree.py", line 580, in parse
self._root = parser._parse_whole(source)
xml.etree.ElementTree.ParseError: no element found: line 1, column 0

.parse()专门解析文件。

如果x是字符串,则使用.fromstring():

root = et.fromstring(x)

如果x是其他内容,则必须先将其转换为字符串。对于cx_Oracle.LOB对象,调用.read()应该可以完成以下操作:

root = et.fromstring(x.read())

错误为

a( 我在x中拥有的不是一个XML文件,而是一个LOB,我必须用导入它

et.fromstring(x.read())

像Tomalak回答/评论和

b( 我没有意识到,为了能够使用.text来获取字段/标记中的内容,您必须对整个内容进行迭代。

所以解决方案看起来是这样的:

for row in source_select:
x = row[(len(row) - 1)]
tree = et.ElementTree(et.fromstring(x.read()))
root = tree.getroot()
for aref in root.iter('name_of_tag'):
print(aref.text)

最新更新