python创建解析XML

python创建解析XML

XML 的存储方式虽然目前很少用,但我们还是的掌握其基本的创建和解析方法,在有些项目中还是能用到。


一、XML 的创建

1,创建步骤:

1,在内存中创建一个空文档对象
2,创建一个根节点对象并设置其属性,将其添加在文档对象中
3,创建叶子节点对象并设置其属性,将其添加在父节点对象中(根节点)
4,创建嵌套叶子节点(孙节点)对象并设置其属性或添加文本对象,将其添加在父节点对象中
5,保存文档

import xml.dom.minidom

#1,在内存中创建一个空的文档对象
doc = xml.dom.minidom.Document()

#2,创建一个根节点SQL对象
root = doc.createElement('SQL')
# 给根节点SQL添加属性
root.setAttribute('db', 'mysql')
#将根节点添加到文档对象中
doc.appendChild(root)

# 3,给根节点SQL添加一个叶子节点select
sel= doc.createElement('select')
root.appendChild(sel)

# 4,叶子节点select下再嵌套叶子节点table
table= doc.createElement("table")
#设置叶子节点table属性
table.setAttribute('name','product')
#给叶子节点table添加文本节点
table.appendChild(doc.createTextNode("表名"))
# 叶子节点select下再嵌套叶子节点data
sql_data= doc.createElement("data")
# 给叶子节点data添加文本节点
sql_data.appendChild(doc.createTextNode("sql=select * from product"))
#将嵌套叶子节点table,data添加到select 叶子节点中
sel.appendChild(table)
sel.appendChild(sql_data)

# 3,给根节点SQL添加一个叶子节点select (兄弟节点)
sub_sel= doc.createElement('select')
root.appendChild(sub_sel)

#4, 叶子节点select下再嵌套叶子节点table
table= doc.createElement("table")
#设置叶子节点table属性
table.setAttribute('name','sub_product')
table.appendChild(doc.createTextNode("表名"))
# 叶子节点select下再嵌套叶子节点data
sql_data= doc.createElement("data")
# 给叶子节点data添加文本节点
sql_data.appendChild(doc.createTextNode("sql=select * from sub_product"))
#将嵌套叶子节点table,data添加到select 叶子节点中
sub_sel.appendChild(table)
sub_sel.appendChild(sql_data)

# 3,给根节点SQL添加一个叶子节点insert(兄弟节点)
ins = doc.createElement('insert')
root.appendChild(ins)

# 4,叶子节点下再嵌套叶子节点
table= doc.createElement("table")
table.setAttribute('name','product')
sql_data= doc.createElement("data")
# 给节点添加文本节点
sql_data.appendChild(doc.createTextNode("sql=insert into product(id,name) values(001,'hua')"))
# 将各子叶子节点添加到父节点insert中
ins.appendChild(table)
ins.appendChild(sql_data)

#5,数据的保存
print(doc.toxml())
fp = open(r'E:\学习笔记\sql.xml', 'w',encoding='utf-8')
doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding="utf-8")
fp.close()

二、XML的解析

1.解析步骤

1, 从xml.dom.minidom模块引入解析器parse dom (Document Object Model) 文档对象模型 parse 解析
2, minidom解析器打开xml文档并将其解析为内存中的一棵树 DOMTree = minidom.parse(parse=None,bufsize=None)
3, 获取xml文档对象,就是拿到树的根 doc = DOMTree.documentElement
4, 获取xml文档内容 doctext = doc.toxml(encoding = None)
5, 判断某个节点node是否存在某个属性 doc.hasAttribute(name) Attribute /əˈtrɪbjuːt/ 属性
6, 获取XML文档中某个父节点下具有相同节点名的节点对象集合,是一个list对象。
node.getElementsByTagName(name)
7, 判断是否有子节点 node .hasChildNodes()
8, 返回节点node下所有子节点组成的list node.childNodes
9, 获取节点node的文本值,即标签之间的文本内容 node.childNodes[index].data

代码如下(示例):

from xml.dom.minidom import parse  #1,引入解析器

#2,minidom解析器打开xml文档并将其解析为内存中的一棵树
DOMTree = parse(r"E:\学习笔记\SQL.xml")
print('domtree= :',type(DOMTree))

#3,获取xml文档对象,就是拿到树的根SQL
SQL = DOMTree.documentElement
print('booklist=:', SQL)

#4,打印整个树的所有标签内容
print(u"xml文档内容:\n%s" %DOMTree.toxml())
#通过某个节点,打印它下面所有的标签内容
print(u"xml文档内容:\n%s" %SQL.toxml())

#5,判断根节点SQL是否有db属性
if SQL.hasAttribute("db"):
  print("sql元素存在db属性")
  # 判断根节点SQL是否有db属性,有则获取并打印属性的值
  print("Root element is", SQL.getAttribute("db"))
else :
  print("sql元素不存在db属性")

#6,获取XML文档中Sql父节点下具有相同节点名的select节点对象集合,是一个list对象。
select = SQL.getElementsByTagName("select")
print(type(select))
print('select=: ',select)

#7,hasChildNodes()获取子节点,如果子节点是个空list,说明没有子节点
if select[0].hasChildNodes():
  print("存在叶子节点\n", select[0].childNodes) #8,返回第一个select节点下所有子节点组成的list
else :
  print("不存在叶子节点")

d={}
for i in range(1,len(select[1].childNodes),2):#去除空节点, 回车换行计算为一个空节点
    # select[1]代表第二个select 节点对象
    # select[1].childNodes[i]:分别读取第二个select对象下面的第1、3个节点(标签节点)
    tag_name = select[1].childNodes[i].tagName #获取某一个节点下的所有子节点的标签名
    print('tagname=: ',tag_name)
    #9,获取节点node的文本值,即标签之间的文本内容
    # .childNodes[0].data---》1、3节点下的第一个子节点(文本节点)的文本内容
    d[tag_name]=select[1].childNodes[i].childNodes[0].data

for k,v in d.items(): #遍历
    print(k,v)

总结

在添加子节点的时候可以用数组存储要添加的文本节点和属性值,然后遍历。 例如:
select_list =[
    {'table':'表名','data':'select * from product'},
    {'table':'表名','data':'select * from product'},
    {'table':'表名','data':'select * from product'},
]

for i in select_list:
    sel =doc.createElement('select')
    root.appendChild(sel)
    table =doc.createElement('table')
    table.setAttribute('name', 'product')
    table.appendChild(doc.createTextNode(str(i['table'])))
    sql_data = doc.createElement('data')
    sql_data.appendChild(doc.createTextNode(str(i['data'])))
    sel.appendChild(table)
    sel.appendChild(sql_data)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值