XML-разбор Python3

Я пытался разобрать XML, используя разные модули python3 и разные статьи из Интернета, но безуспешно.

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

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><SOAP-ENV:Header/>
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<cwmp:GetParameterValuesResponse>
    <ParameterList SOAP-ENC:arrayType="cwmp:ParameterValueStruct[3]">
        <ParameterValueStruct>
            <Name>SOME_NAME_1_HERE</Name>
            <Value>2</Value>
        </ParameterValueStruct>
        <ParameterValueStruct>
            <Name>SOME_NAME
SOME_NAME_1_HERE 2
SOME_NAME_2_HERE 180
SOME_NAME_3_HERE 1800
HERE</Name> <Value>180</Value> </ParameterValueStruct> <ParameterValueStruct> <Name>SOME_NAME_3_HERE</Name> <Value>1800</Value> </ParameterValueStruct> </ParameterList> </cwmp:GetParameterValuesResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

Мне нужно взять данные из тегов XML: Имя и значение Должно быть что-то вроде:

SOME_NAME_1_HERE 2
SOME_NAME_2_HERE 180
SOME_NAME_3_HERE 1800

Как я могу получить эти значения с помощью Python3 (будет хорошо использовать модули Python по умолчанию, а не bs4)?

Спасибо


person Petro Pikh    schedule 24.04.2017    source источник


Ответы (2)


Используя xml.etree, вы можете выполнить простое выражение XPath .//element_name, чтобы найти элемент в любом месте внутри данного элемента контекста:

from xml.etree import ElementTree as ET
tree = ET.parse('path_to_your_xml.xml')
root = tree.getroot()

for p in root.findall('.//ParameterValueStruct'):
    print("%s | %s" % (p.find('Name').text, p.find('Value').text))
person har07    schedule 24.04.2017
comment
Большое спасибо, ваш код работает. Но с некоторыми изменениями в PRINT. - person Petro Pikh; 24.04.2017

Вы можете попробовать что-то вроде этого:

import xml.etree.ElementTree
e = xml.etree.ElementTree.parse('Newfile.xml').getroot()

print(e)
for atype in e.findall('.//ParameterValueStruct'):
    print("%s | %s" % (atype.find('Name').text, atype.find('Value').text))
person Reda Maachi    schedule 24.04.2017
comment
Спасибо, но ваш код ничего не печатает. /usr/bin/python3.5 /home/ppikh/Desktop/test.py Process finished with exit code 0 - person Petro Pikh; 24.04.2017
comment
@ har07 В вашем случае я получил: нет для каждого отпечатка. - person Petro Pikh; 24.04.2017
comment
@PetroPikh get() предполагается использовать для чтения атрибута XML. Вместо этого используйте find(), чтобы получить один XML-элемент, а затем получите внутренний текст элемента из свойства text. Смотрите другой ответ.. - person har07; 24.04.2017