一、修改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> """
二、案例


编写js:输入值

编写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'}] """