2016-06-06 12 views
0

Können Sie mir bitte mit der folgenden Anforderung helfen. Ich habe versucht, so viel wie möglich über diese Anforderung zu erklären. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Danke im Voraus für Ihre Antwort.Erstellen von XML mit Python Elementbaum libarary

Ich habe eine Oracle-Tabelle mit den folgenden Daten:

Tag_name, tag_value 
empname Smith 
empno 5102 
sal  600 
deptno 10 
empname Jhon 
empno 4102 
sal  800 
deptno 20 

und meine xml wie

<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> 
aussehen sollten

unten ist der Code, die 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)) 
zu erzeugen ist mit

anstatt die gewünschte Ausgabe zu bekommen bekomme ich eine Ausgabe wie unten

<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> 

Im Grunde für den zweiten Mitarbeiter wird das schließende Tag nicht gedruckt. Bitte beraten. Vielen Dank!

Antwort

0

müssen Sie die child = SubElement(top,'employee') in der for Schleife setzen, und setzen nur die child in, wenn die empname Änderungen:

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] 

Der obige Code funktioniert, wenn der Name ändert sich jedoch, wenn zwei Datensätze mit der existiert Der gleiche Name und diese Datensätze sind der Reihe nach in cursor, dann wird dies fehlschlagen, können Sie diese anpassen, um den Scheck einzigartig zu machen, möglicherweise die Einführung der empno, aber ich werde dies überlassen.

Ihrem Codebeispiel fehlen entsprechende Einrückungen, Sie sollten dies beim Hochladen berücksichtigen und vermeiden, für solche Abstimmungen zu stimmen.