2016-06-06 3 views
0

Не могли бы вы помочь мне с нижеследующим требованием. Я попытался объяснить как можно больше об этом требовании. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Заранее благодарим за ваш ответ.Создание XML с использованием python Элементарное дерево libarary

У меня есть таблица оракула со следующими данными:

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/[email protected]") 
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

вам нужно поставить 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, но я буду оставьте это.

В вашем образце кода отсутствуют правильные отступы, вы должны думать об этом при публикации и избегать проголосовать за такие.