Python3解析XML

7
我将尝试使用不同的Python3模块和网络文章来解析XML,但是一直没有成功。以下是我要解析的XML内容:
```html

我有这个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_2_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)?
谢谢。
2个回答

10

使用 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))

非常感谢,你的代码有效。但是需要对 PRINT 进行一些更改。 - Petro Pikh
刚刚花了一些时间解决一个问题,其中这个答案出现了某些原因无法工作的情况。原来findall()会受到元素的xmlns属性的影响。因此,请确保您的元素具有有效的xmlns属性,如果这对您不起作用。 - micka190

1
您可以尝试类似以下的代码:

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

谢谢,但是你的代码没有输出任何内容。`/usr/bin/python3.5 /home/ppikh/Desktop/test.py进程以退出码0结束。` - Petro Pikh
e.findall('.//ParameterValueStruct') - har07
@har07 在你的情况下,我收到了:每个打印都是无。 - Petro Pikh
@PetroPikh get() 应该用于读取 XML 属性。请改用 find() 获取单个 XML 元素,然后从 text 属性中获取元素的内部文本。请参见其他答案。 - har07

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接