У меня есть этот XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
    <record ID="#046CE9401D01467B2BDBAF0" NumDoc="1461">
        <NAME>
            <P>Pedrito De Rosa</P>
            <P>NIE X1111222233</P>
            <P>tf 2283396922</P>
            <P>efael@hostmailer.com</P>
        </NAME>
        <ADDRESS>
            <P>Paseo Jauregizahar 234 &#45; 1&#46; A&#46; Donostia </P>
        </ADDRESS>
        <SUBJECT>
            <P>paisaje y ciudad </P>
        </SUBJECT>
        <QUERYS>
            <P>2014-12-10 Avance Normas Subsidiarias</P>
            <P>Otras consultas</P>
        </QUERYS>
    </record>
</root>

Я пытаюсь прочитать этот XML и вставить значения в таблицу mysql (NAME, ADDRESS, SUBJECT, QUERYS). Проблема в том, когда я пытаюсь прочитать, например, поле ИМЯ, например:

from lxml import etree as ET

tree = ET.parse('data/data.xml')
root = tree.getroot()
records = tree.findall('record')
for i, record in enumerate(records):
    myname = record.find("NAME/P")
    print (myname.text)

Выход с этим кодом - «Pedrito De Rosa» вместо всего содержимого. Я имею в виду, он должен получить все элементы P внутри тегов "NAME", иначе мы теряем данные ...

Как я могу получить все данные в элементах? Я пытался с record.findAll ("NAME / P"), но нет метода findAll.

Любая помощь или подсказка?

Я создал Pyfiddle, если кто-то может помочь ... https://pyfiddle.io/fiddle/9ed9743d-4d6e -4400 - bfb5-19ba2bbf65f7 / ? я = истинное

Заранее спасибо

0
Kioko Kiaza 9 Июл 2019 в 12:21

4 ответа

Лучший ответ
from lxml import etree as ET

tree = ET.parse('data.xml')
root = tree.getroot()
records = tree.findall('record')
for i, record in enumerate(records):
    myname = record.findall("NAME/P")

    for item in myname:
        print (item.text)

Выход:

Pedrito De Rosa
NIE X1111222233
tf 2283396922
efael@hostmailer.com
1
ncica 9 Июл 2019 в 09:34

Попробуйте этот код. Я выбираю регулярные выражения, чтобы получить имя из XML.

Код .

import re

line = "<NAME><P>Pedrito De Rosa</P></NAME>"
matchObj = re.search( r'.*NAME..P.(.*)..P...NAME', line, re.M|re.I)
if matchObj:
    print("Name : ", matchObj.group(1))

Выход .

Name :  Pedrito De Rosa 
0
Usman 9 Июл 2019 в 09:39

Ниже

import xml.etree.ElementTree as ET

elements = ['NAME','ADDRESS','SUBJECT','QUERYS']
data = {}
xml = '''<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
    <record ID="#046CE9401D01467B2BDBAF0" NumDoc="1461">
        <NAME>
            <P>Pedrito De Rosa</P>
            <P>NIE X1111222233</P>
            <P>tf 2283396922</P>
            <P>efael@hostmailer.com</P>
        </NAME>
        <ADDRESS>
            <P>Paseo Jauregizahar 234 &#45; 1&#46; A&#46; Donostia </P>
        </ADDRESS>
        <SUBJECT>
            <P>paisaje y ciudad </P>
        </SUBJECT>
        <QUERYS>
            <P>2014-12-10 Avance Normas Subsidiarias</P>
            <P>Otras consultas</P>
        </QUERYS>
    </record>
</root>'''

root = ET.fromstring(xml)
for e in elements:
  lst = root.find('.//record/{}'.format(e)).getchildren()
  data[e] =  [x.text for x in lst]
0
balderman 9 Июл 2019 в 10:08

С гибкой функцией element.xpath:

...
root = tree.getroot()

records = tree.findall('record')
for i, record in enumerate(records):
    names = record.xpath("NAME/P/text()")
    print(names)

    addresses = record.xpath("ADDRESS/P/text()")
    print(addresses)

    subjects = record.xpath("SUBJECT/P/text()")
    print(subjects)

    querys = record.xpath("QUERYS/P/text()")
    print(querys)

Выход:

['Pedrito De Rosa', 'NIE X1111222233', 'tf 2283396922', 'efael@hostmailer.com']
['Paseo Jauregizahar 234 - 1. A. Donostia ']
['paisaje y ciudad ']
['2014-12-10 Avance Normas Subsidiarias', 'Otras consultas']
1
RomanPerekhrest 9 Июл 2019 в 09:39