python 读写.xml文件

1 XML文件读取

测试文件 test.xml 内容如下:

<?xml version="1.0" encoding="utf-8"?>

<root>
    <time>
        <years>2022</years>
        <month>04</month>
        <day>24</day>
    </time>
    <PORT_LIST>
		<COM Name="COM3" Remarks="" Baund="9600" Parity="0" StopBit="0" DataBit="0" FlowCtrl="0" TransMode="0" CharType="0" BreakTime="10" />
		<COM Name="COM4" Remarks="" Baund="9600" Parity="0" StopBit="0" DataBit="0" FlowCtrl="0" TransMode="0" CharType="0" BreakTime="10" />
		<NET Name="NET000" Remarks="" DesIP="127.0.0.1" LocalPortID="54125" DesPortID="502" />
		<NET Name="NET001" Remarks="" DesIP="127.0.0.1" LocalPortID="502" DesPortID="502" />
	</PORT_LIST>
</root>

1 获得 .xml文件根节点

#!/usr/bin/python
# -*- coding: GBK -*-
import xml.etree.ElementTree as ET
import xml.dom.minidom as minidom

tree = ET.parse('test.xml')
root = tree.getroot()  #获得根节点

2 获得节点的属性

# <item name="月" addr="33"/>
# 获得节点
month = node.attrib['name']
addr  = node.attrib['addr']

3 获得节点的子节点

4 Supported XPath syntax

在这里插入图片描述

  • 1 路径查找:
#查找到root子节点 time
nodetime = root.find('time')
print(nodetime.text )
#查找到root子节点 time的子节点years
node_years = root.find('time/years')
print(node_years.text )
  • 2 查找含有某一属性的节点
# 查找到 属性="COM3"的所有节点
nodecom3 = root.findall(".//*[@Name='COM3']")
print(nodecom3, type(nodecom3)) #nodecom3 list
print(nodecom3[0].attrib['Baund'])
  • 3 查找属性等于某一值得节点
在这里插入代码片

2 写XML文件

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import xml.etree.ElementTree as ET
import xml.dom.minidom as minidom


#tree = ET.parse('01.xml')
'''
中文这个是转换前的,现在是打算把
<type>r</type>
<format>bin</format>
格式的转换到yx组
其他<type>r</type>
转换到yc组
'''

class  XmlConvert(object):
    def __init__(self, xmlfile):
        self.tree = ET.parse(xmlfile)
        self.root = self.tree.getroot()
        self.node_param_list = []
        for node in list(self.root):
            if node.tag == 'params':
                for node_param in node:
                    self.node_param_list.append(node_param)  #node param  -> <params><param></param></params>
        #  遥信信息
        self.match_nodes = self.get_yx_info()
        print(self.match_nodes)

        for node in self.match_nodes:
            print(node.findtext('name'), node.attrib['groupid'], node.attrib['addr'] )
        #写 .xml
        #dom= minidom.Document()
        self.new_xml("新文件.xml")

    def new_xml(self,xmlfile):
        dom = minidom.getDOMImplementation().createDocument(None, 'Root', None)
        root = dom.documentElement
        for i in range(5):
            element = dom.createElement('Name')
            element.appendChild(dom.createTextNode('default'))
            element.setAttribute('age', str(i))
            root.appendChild(element)
        # 保存文件
        with open(xmlfile, 'w', encoding='utf-8') as f:
            dom.writexml(f, addindent='\t', newl='\n', encoding='utf-8')


    def get_yx_info(self):
        self.match_nodes = []
        for node_param in self.node_param_list:
            #判断子节点  <type>rw</type> <format>bin</format>
            flag = 0
            #if node_param.findtext("type") == 'rw' or node_param.findtext("format") == 'bin':
            if node_param.findtext("type") == 'rw':
                flag += 1
            if node_param.findtext("format") == 'bin':
                flag += 1
            if 2 == flag: self.match_nodes.append(node_param)
        return  self.match_nodes


if __name__ == '__main__':
    # tree = ET.parse('PCS调试串口通信点表.xml')
    XmlConvert('PCS调试串口通信点表.xml')
    pass
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import xml.etree.ElementTree as ET
import xml.dom.minidom as minidom


#tree = ET.parse('01.xml')
'''
中文这个是转换前的,现在是打算把
<type>r</type>
<format>bin</format>
格式的转换到yx组
其他<type>r</type>
转换到yc组
'''

class Xmlwrite(object):
    def __init__(self, xml):
        self.xml_name = xml
        self.dom = minidom.getDOMImplementation().createDocument(None, 'dmp', None)
        #设置root节点属性
        root_attrib = {'station': 'PCS塔机测试','name': 'PCS_TOWER', 'kind':'PCS_TOWER' }
        #self.set_node_attrib(self.xmlroot, root_attrib )
        self.xmlroot = self.dom.documentElement
        for i in range(5):
            # element = self.dom.createElement('Name')
            # element.appendChild(self.dom.createTextNode('default'))
            # element.setAttribute('age', str(i))
            # #element.setAttribute("station", "PCS塔机测试")
            # self.set_node_attrib(element , root_attrib )
            node = self.new_node('tag_name', "goodjob", None )
            self.set_node_attrib(node, root_attrib )
            #self.xmlroot.appendChild(element)

    
    #设置node属性
    def set_node_attrib(self, node , nodeinfo ):
        for key,value in  nodeinfo.items():
            node.setAttribute(key,value)

    #新建node
    def new_node(self, tag_name , text , parent_node=None ):
        node = self.dom.createElement(tag_name)
        node.appendChild(self.dom.createTextNode(text))
        if parent_node:
            parent_node.appendChild(node)
        else:
            self.xmlroot.appendChild(node)
        return node
    #保存文件
    def save_xml(self, name=None):
        if name:
        # 保存文件
            with open( name, 'w', encoding='utf-8') as f:
                self.dom.writexml(f, addindent='\t', newl='\n', encoding='utf-8')
        else:
            with open( self.xml_name, 'w', encoding='utf-8') as f:
                self.dom.writexml(f, addindent='\t', newl='\n', encoding='utf-8')






class  XmlConvert(object):
    def __init__(self, xmlfile):
        self.tree = ET.parse(xmlfile)
        self.root = self.tree.getroot()
        self.node_param_list = []
        for node in list(self.root):
            if node.tag == 'params':
                for node_param in node:
                    self.node_param_list.append(node_param)  #node param  -> <params><param></param></params>
        #  遥信信息
        self.match_nodes = self.get_yx_info()
        print(self.match_nodes)

        for node in self.match_nodes:
            print(node.findtext('name'), node.attrib['groupid'], node.attrib['addr'] )
        #写 .xml
        #dom= minidom.Document()
        #self.new_xml("新文件.xml")

    def new_xml(self,xmlfile):
        dom = minidom.getDOMImplementation().createDocument(None, 'Root', None)
        root = dom.documentElement
        for i in range(5):
            element = dom.createElement('Name')
            element.appendChild(dom.createTextNode('default'))
            element.setAttribute('age', str(i))
            root.appendChild(element)
        # 保存文件
        with open(xmlfile, 'w', encoding='utf-8') as f:
            dom.writexml(f, addindent='\t', newl='\n', encoding='utf-8')


    def get_yx_info(self):
        self.match_nodes = []
        for node_param in self.node_param_list:
            #判断子节点  <type>rw</type> <format>bin</format>
            flag = 0
            #if node_param.findtext("type") == 'rw' or node_param.findtext("format") == 'bin':
            if node_param.findtext("type") == 'rw':
                flag += 1
            if node_param.findtext("format") == 'bin':
                flag += 1
            if 2 == flag: self.match_nodes.append(node_param)
        return  self.match_nodes


if __name__ == '__main__':
    # tree = ET.parse('PCS调试串口通信点表.xml')
    #XmlConvert('PCS调试串口通信点表.xml')
    newxml =  Xmlwrite("convert.xml")
    newxml.save_xml("转化后文件.xml")
    pass
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值