请你帮我解决下面的要求。我已尽力解释这个要求。如果您需要任何进一步的信息,请告诉我。在此先感谢您的回复。
我有一个包含以下数据的oracle表:
Tag_name, tag_value
empname Smith
empno 5102
sal 600
deptno 10
empname Jhon
empno 4102
sal 800
deptno 20
我的xml应该看起来像
<employeedetails>
<employee>
<empname>Smith</empname>
<empno>5102</empno>
<sal>600</sal>
<deptno>10</deptno>
</employee>
<employee>
<empname>john</empname>
<empno>4102</empno>
<sal>800</sal>
<deptno>20</deptno>
</employee>
<employeedetails>
下面是用于生成XML的代码
from xml.etree.ElementTree import Element, SubElement, Comment
from xml.etree import ElementTree
from xml.dom import minidom
import cx_Oracle
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ElementTree.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
db = cx_Oracle.connect("username/pwd@servername")
cursor = db.cursor()
cursor.arraysize = 500
cursor.execute("select * from employee") parameter
top = Element('employeedetails')
child = SubElement(top,'employee')
for i in cursor:
sub_child = SubElement(child, i[1])
sub_child.text = i[2]
print (prettify(top))
而不是获得所需的输出,如下所示输出
<employeedetails>
<employee>
<empname>Smith</empname>
<empno>5102</empno>
<sal>600</sal>
<deptno>10</deptno>
<empname>john</empname>
<empno>4102</empno>
<sal>800</sal>
<deptno>20</deptno>
</employee>
<employeedetails>
基本上对于第二个员工,结束标签没有得到打印。请指教。谢谢!
答案 0 :(得分:0)
您需要将child = SubElement(top,'employee')
置于for
循环中,并且仅在child
更改时将empname
置于其中:
oldempname = None
for i in cursor:
if (i[1] == 'empname') and (not i[2] == oldempname):
child = SubElement(top,'employee')
oldempname = i[2]
sub_child = SubElement(child, i[1])
sub_child.text = i[2]
如果名称发生变化,上述代码可以正常工作,但是如果存在两个具有相同名称的记录,并且这些记录按顺序排列在cursor
中,那么这将失败,您可以对此进行调整要使检查唯一,可能会引入empno
,但我会留给您。
您的代码示例缺少适当的缩进,您应该在发布时考虑这一点,并避免因此而被投票。