说说题外话:
最近有个需求,对接的是比较老的一套接口,返回的数据中有类似于xml的数据,但不是标准的xml格式。本人主要方向是写java web方面的全栈工程师,对python也挺感兴趣的,就使用python进行了这次的数据处理工作,下面分享下如何解决本次问题的过程,希望能帮到你。
样例数据
本次接触的到的数据有两种格式
1.<node><name>a</name><value>1</value></node><node><name>a</name><value>1</value></node><node><name>a</name><value>1</value></node>
2.<abc>123</abc>
数据处理
采用python对xml解析的方式进行本次的数据解析
导包
#首先导入解析xml的包
import xml.etree.ElementTree as Etree
其他也有一些对xml解析的包,但是使用过程中总觉得有些问题,所以这里就选用的这个包
分析
如果直接使用xml.etree.ElementTree直接对xml_1字符串进行格式化
import xml.etree.ElementTree as Etree
xml_1 = """"<node><name>a</name><value>1</value></node><node><name>a</name><value>1</value></node><node><name>a</name><value>1</value></node>"""
xml_2 = """<abc>123</abc>"""
print(Etree.fromstring(xml_1))
出现报错
xml.etree.ElementTree.ParseError: unclosed token: line 1, column 0
因为xml_1并不是一个完整的xml格式,是3个<node></node>
组成的
解决方式
先将xml_1转变为一个完整的xml结构
import xml.etree.ElementTree as Etree
xml_1 = """"<node><name>a</name><value>1</value></node><node><name>a</name><value>1</value></node><node><name>a</name><value>1</value></node>"""
xml_2 = """<abc>123</abc>"""
newXml_1 = '<root>' + xml_1 + '</root>'
print(Etree.fromstring(newXml_1)) #<Element 'root' at 0x0000019479730040>
print(len(Etree.fromstring(newXml_1))) #3
解析成功
剩下的就是获取到数据了,很正常的思路,一个for循环
每次循环,对每个node使用find函数分别获取到name,value的对象,使用text属性获取到内容
import xml.etree.ElementTree as Etree
xml_1 = """"<node><name>a</name><value>1</value></node><node><name>a</name><value>1</value></node><node><name>a</name><value>1</value></node>"""
xml_2 = """<abc>123</abc>"""
newXml_1 = '<root>' + xml_1 + '</root>'
#print(Etree.fromstring(newXml_1))
#print(len(Etree.fromstring(newXml_1)))
nodes = Etree.fromstring(newXml_1)
for node in nodes:
print("name="+node.find("name").text+";value="+node.find("value").text)
#结果
#name=a;value=1
#name=a;value=1
#name=a;value=1
同理xml_2字符串解析
直接使用Etree.fromstring(str)进行格式化后,直接获取其text属性即可
import xml.etree.ElementTree as Etree
xml_1 = """"<node><name>a</name><value>1</value></node><node><name>a</name><value>1</value></node><node><name>a</name><value>1</value></node>"""
xml_2 = """<abc>123</abc>"""
# newXml_1 = '<root>' + xml_1 + '</root>'
#print(Etree.fromstring(newXml_1))
#print(len(Etree.fromstring(newXml_1)))
# nodes = Etree.fromstring(newXml_1)
# for node in nodes:
# print("name="+node.find("name").text+";value="+node.find("value").text)
abc = Etree.fromstring(xml_2)
print(abc.text) #123
PS:以上是本次分享,希望大家都能在程序的道路上越走越远,加油陌生人!!!