Lxml讀寫XML字符


一、修改xml文件的節點文本、節點屬性、刪除節點

from lxml import etree

將string轉換成python對象
e1 = etree.XML(xml_content)

讀取xml字符串中的指定節點文本與屬性
a1 = e1.xpath("//SPEC_LIST/text()")   # 節點文本
a1 = e1.xpath("//SPEC_LIST/@class")   # 節點屬性

添加子節點
obj = e1.xpath("//SPEC_LIST")[0]      # 獲取節點
spec = etree.SubElement(obj, "SPEC")  # 添加子節點

修改節點文本
obj = e1.xpath("//SPEC_LIST")[0]      # 獲取節點
obj.text = '文本'                      # 修改節點文本

修改節點屬性
obj = e1.xpath("//SPEC_LIST")[0]      # 獲取節點
obj.attrib['cpu'] = "8"               # 設置節點屬性,attrib屬性是一個字典

將python對象轉換成string
content = etree.tounicode(e1)         # unicode
content = etree.tostring(e1)          # bytes

 

例子:

from lxml import etree

# xml文件
""" <breakfast> <food> <name>apple</name> <description file='/etc/libvirt/qemu/apple.xml'></description> <mac address='123456789'></mac> </food> </breakfast> """ xml_content = "<breakfast><food><name>apple</name><description file='/etc/libvirt/qemu/apple.xml'></description><mac address='123456789'></mac></food></breakfast>" """ 實現: 修改name為tomato 修改/etc/libvirt/qemu/apple.xml為 /usr/bin/tomato.xml 刪除mac這一行 """ config = etree.XML(xml_content) name = config.xpath("//name")[0] # <Element name at 0x256fff06108> description = config.xpath("//description")[0] # <Element description at 0x256fff06148> food = config.xpath("//food")[0] # <Element food at 0x256fff061c8> mac = config.xpath("//mac")[0] # <Element mac at 0x256fff06208> print(dir(name)) """ ['__bool__', '__class__', '__contains__', '__copy__', '__deepcopy__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '_init', 'addnext', 'addprevious', 'append', 'attrib', 'base', 'clear', 'cssselect', 'extend', 'find', 'findall', 'findtext', 'get', 'getchildren', 'getiterator', 'getnext', 'getparent', 'getprevious', 'getroottree', 'index', 'insert', 'items', 'iter', 'iterancestors', 'iterchildren', 'iterdescendants', 'iterfind', 'itersiblings', 'itertext', 'keys', 'makeelement', 'nsmap', 'prefix', 'remove', 'replace', 'set', 'sourceline', 'tag', 'tail', 'text', 'values', 'xpath'] """ name.text = 'tomato' description.attrib['file'] = '/usr/bin/tomato.xml' food.remove(mac) xml_content = etree.tounicode(config) print(xml_content) """ <breakfast> <food> <name>tomato</name> <description file="/usr/bin/tomato.xml"/> </food> </breakfast> """

 

 

二、案例

 

html頁面布局

 

js渲染頁面

 

 編寫js:輸入值

View Code

 

 編寫js:獲取值保存到數據庫中:

var params_list = [];

// 構造參數Map>> Array (動態參數)
$('#param_se option').each(function () { // 構造單個參數信息 var txt_param_list = $(this).text().split(":"); var val_param = $(this).prop("value"); var param_id = $(this).attr("param_id"); var param_dict = { "param_name": txt_param_list[0], "variable_name": val_param, "param_value": txt_param_list[1], "param_id": param_id }; params_list.push(param_dict) }); console.log(params_list)

 

from lxml import etree
root = etree.Element("root")
config = [{'param_name': '主機參數2', 'variable_name': 'hostname2', 'param_value': 'hostname_value2'},
{'param_name': '主機參數1', 'variable_name': 'hostname1', 'param_value': 'hostname_value1'}]
# 動態參數
for c_config in config:
    param_node = etree.SubElement(root, "param")
    param_node.attrib["param_name"] = c_config["param_name"].strip()
    param_node.attrib["variable_name"] = c_config["variable_name"].strip()
    param_node.attrib["param_value"] = c_config["param_value"].strip()
config = etree.tounicode(root)
print(config)
"""
<root><param param_name="主機參數2" variable_name="hostname2" param_value="hostname_value2"/>
<param param_name="主機參數1" variable_name="hostname1" param_value="hostname_value1"/></root>
"""

 

數據庫獲取通過etree模塊展示到前端:

 

from lxml import etree

config = '<root><param param_name="主機參數2" variable_name="hostname2" param_value="hostname_value2"/><param param_name="主機參數1" variable_name="hostname1" param_value="hostname_value1"/></root>'
param_list = []
pre_config = "<root></root>"

if config:
    config = etree.XML(config)
else:
    config = etree.XML(pre_config)
param_nodes = config.xpath("//param")
print(param_nodes)  # [<Element param at 0x25f8e5ab208>, <Element param at 0x25f8e5ab188>]
for pn in param_nodes:
    print(pn.attrib)
    """
    {'param_name': '主機參數2', 'variable_name': 'hostname2', 'param_value': 'hostname_value2'}
    {'param_name': '主機參數1', 'variable_name': 'hostname1', 'param_value': 'hostname_value1'}
    """
    param_list.append({
        "param_name": pn.attrib.get("param_name", ""),
        "variable_name": pn.attrib.get("variable_name", ""),
        "param_value": pn.attrib.get("param_value", ""),
    })

print(param_list)
"""
[{'param_name': '主機參數2', 'variable_name': 'hostname2', 'param_value': 'hostname_value2'},
{'param_name': '主機參數1', 'variable_name': 'hostname1', 'param_value': 'hostname_value1'}]
"""

 

re正則:

param_type = 'HOST'
content = '#!/bin/bash echo "((hostname1))"echo "((hostname2))"' 

com = re.compile("\(\((.*?)\)\)")
variable_list = com.findall(content)
print(variable_list)   #['hostname1', 'hostname2']

 

data = []
for i in variable_list:
    for j in param_list:
        if i.strip() == j["variable_name"]:
            data.append({
                "param_name": j["param_name"],
                "variable_name": j["variable_name"],
                "param_value": j["param_value"],
                "type": "SCRIPT"
            })
            break

print(data)
"""
[{'param_name': '主機參數1', 'variable_name': 'hostname1', 'param_value': 'hostname_value1', 'type': 'SCRIPT'}, 
{'param_name': '主機參數2', 'variable_name': 'hostname2', 'param_value': 'hostname_value2', 'type': 'SCRIPT'}]
"""

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM