Estoy tratando de escribir un script de Python que vaya a través de Filas y las ponga en mi base de datos

Esta es una estructura de mi xml:

Root>
    -<SvcNf>
        -<PersonNf>
            -<PersonList>
                -<Row>
                    <SysName>MI8</SysName>
                     <ServerDt>2016-10-28 03:00:12 +03:00</ServerDt>
                     <UID>9457A55E17341AA7ASDEDS057A8BFFF3</UID>
                     <PersID>007</PersID>
                     <Emp_name>James Bond</Emp_name>
                     <EventID>25</EventID>
                     <EventTXT>Drinking alcohol</EventTXT>
                     <CauseEventID>03</CauseEventID>
                     <CauseEventTXT>Martini with vodka</CauseEventTXT>
                     <EventBegda>2017-10-18</EventBegda>
                     <EventEndda>2017-10-18</EventEndda>
                     <AccrualsSum>171.0</AccrualsSum>
                     <AccrualsProz>0.0</AccrualsProz>
                     <AccrualsName>Chinees_</AccrualsName>
                     <OrderNum>P-336</OrderNum>
                     <Perg>0</Persg>
                     <Perk>15</Persk>
                     <Awart/>
                 </Row>
                 -<Row>
                     .....
                 </Row>
                <Row/>
            </PersonList>
        </PersonNf>
    </SvcNf>
</Root>

Entonces, cuando uso este código para analizar XML:

    import xml.etree.ElementTree as ET
    root = ET.parse(events).getroot()
    nodes = root.findall("Row")
    for node in nodes:
            print(node.text)

El resultado va a nula

¡Muchas gracias!

EDITAR

El valor nominal de la fila es

['MI8', '2016-10-28 03:00:12 +03: 00', '9457A55E17341AA7ASDEDS057A8BFFF3', etc.]

1
chipie 30 oct. 2017 a las 18:13

3 respuestas

La mejor respuesta

Reemplace node.text por [child.text for child in node]. Al final, solo necesita usar la función join para convertir la lista en una cadena.

https://repl.it/N144/1

root = ET.fromstring("""<Root>
    <SvcNf>
        <PersonNf>
            <PersonList>
                <Row>
                     <SysName>MI8</SysName>
                     <ServerDt>2016-10-28 03:00:12 +03:00</ServerDt>
                     <UID>9457A55E17341AA7ASDEDS057A8BFFF3</UID>
                     <PersID>007</PersID>
                     <Emp_name>James Bond</Emp_name>
                     <EventID>25</EventID>
                     <EventTXT>Drinking alcohol</EventTXT>
                     <CauseEventID>03</CauseEventID>
                     <CauseEventTXT>Martini with vodka</CauseEventTXT>
                     <EventBegda>2017-10-18</EventBegda>
                     <EventEndda>2017-10-18</EventEndda>
                     <AccrualsSum>171.0</AccrualsSum>
                     <AccrualsProz>0.0</AccrualsProz>
                     <AccrualsName>Chinees_</AccrualsName>
                     <OrderNum>P-336</OrderNum>
                     <Persg>0</Persg>
                     <Persk>15</Persk>
                     <Awart/>
                 </Row>
                <Row/>
            </PersonList>
        </PersonNf>
    </SvcNf>
</Root>""")

nodes = root.findall(".//Row")
for node in nodes:
  print node # print node object
  print(node.text) # print nothing
  print [child.text for child in node] # print child text (as list)
1
Indent 30 oct. 2017 a las 15:47

Con el XML ya desinfectado y el selector XML, tendrá lo que desea:

events = b'''
<Root>
    <SvcNf>
        <PersonNf>
            <PersonList>
                <Row>
                    <SysName>MI8</SysName>
                     <ServerDt>2016-10-28 03:00:12 +03:00</ServerDt>
                     <UID>9457A55E17341AA7ASDEDS057A8BFFF3</UID>
                     <PersID>007</PersID>
                     <FIO>James Bond</FIO>
                     <EventID>25</EventID>
                     <EventTXT>Drinking alcohol</EventTXT>
                     <CauseEventID>03</CauseEventID>
                     <CauseEventTXT>Martini with vodka</CauseEventTXT>
                     <EventBegda>2017-10-18</EventBegda>
                     <EventEndda>2017-10-18</EventEndda>
                     <AccrualsSum>171.0</AccrualsSum>
                     <AccrualsProz>0.0</AccrualsProz>
                     <AccrualsName>Chinees_</AccrualsName>
                     <OrderNum>P-336</OrderNum>
                     <Perg>0</Perg>
                     <Perk>15</Perk>
                     <Awart/>
                </Row>                 
                <Row/>
            </PersonList>
        </PersonNf>
    </SvcNf>
</Root>
'''

import xml.etree.ElementTree as ET
root = ET.fromstring(events)
nodes = root.findall(".//Row")
#[<Element 'Row' at 0x00C217E0>, <Element 'Row' at 0x00C216C0>]
0
Rafael Aguilar 30 oct. 2017 a las 15:29

Tienes un XML no válido:

 <PersID>007</TabNum>
 <Emp_name>James Bond</FIO>

Intenta arreglar tu XML:

 <PersID>007</PersID>
 <Emp_name>James Bond</Emp_name>
3
Indent 30 oct. 2017 a las 15:19