使用python元素树libarary创建XML

时间:2016-06-06 14:40:11

标签: xml oracle python-3.4 elementtree

请你帮我解决下面的要求。我已尽力解释这个要求。如果您需要任何进一步的信息,请告诉我。在此先感谢您的回复。

我有一个包含以下数据的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>

基本上对于第二个员工,结束标签没有得到打印。请指教。谢谢!

1 个答案:

答案 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,但我会留给您。

您的代码示例缺少适当的缩进,您应该在发布时考虑这一点,并避免因此而被投票。