zoukankan      html  css  js  c++  java
  • python xml文件解析 及生成xml文件

    #解析一个database的xml文件
    
    """
    <databaselist type="database config">
        <database>
            <host>localhost</host>
            <username>root</username>
            <password>11111</password>
            <datasename>wulaoshi</datasename>
        </database>
    </databaselist>
    """
    
    #解析xml文件
    domtree=parse('d:\pylianxi\data.xml')
    
    #获取根节点
    datalist=domtree.documentElement
    
    d={}
    #获取标签为database的子节点
    database=datalist.getElementsByTagName('database')
    
    #database的子节点轮询,过滤掉textNode节点,取出文本值
    for i in database[0].childNodes[1::2]:
        tag=i.tagName
        d[tag]=i.childNodes[0].data #childNodes 获取的是一个列表,通过childNodes[0]获取具体对象
    
    print('database:',d)

     2、手动写一个xml文件

    #写xml
    
    from xml.dom.minidom import *
    
    #创建一个文档对象
    doc=Document()
    
    #创建一个根节点
    root=doc.createElement('managers')
    
    #根节点添加属性
    root.setAttribute('company','中体彩')
    print(root.getAttribute('company'))
    
    #根节点加入到tree
    doc.appendChild(root)
    
    
    #创建二级节点
    company=doc.createElement('gloryroad')
    name=doc.createElement('name')
    name.appendChild(doc.createTextNode('公司名称')) #添加文本节点
    
    #创建一个带着文本节点的子节点
    ceo=doc.createElement('ceo')
    ceo.appendChild(doc.createTextNode('吴总'))  #<ceo>吴总</ceo>
    
    company.appendChild(name) #name加入到company
    company.appendChild(ceo)
    root.appendChild(company)#company加入到根节点
    
    print(ceo.tagName)
    
    print(doc.toxml())
    
    #存成xml文件
    fp=open('d:\pylianxi\test.xml','w',encoding='utf-8')
    doc.writexml(fp,indent='',addindent='	',newl='
    ',encoding='utf-8')
    fp.close()

     3、通过字典数据 存成xml文件

    from xml.dom.minidom import Document
    #在内存中创建一个空的文档
    doc = Document() 
    
    #创建一个根节点Managers对象
    root = doc.createElement('Managers') 
    
    #设置根节点的属性
    root.setAttribute('company', '哈哈科技') 
    root.setAttribute('address', '科技软件园') 
    
    #将根节点添加到文档对象中
    doc.appendChild(root)
     
    managerList = [{'name' : 'joy',  'age' : 27, 'sex' : ''},
                   {'name' : 'tom', 'age' : 30, 'sex' : ''},
                   {'name' : 'ruby', 'age' : 29, 'sex' : ''}  ]
    
    for i in managerList :
      nodeManager = doc.createElement('Manager')
      for j in i:
        
        nodeName = doc.createElement(j)
        #给叶子节点name设置一个文本节点,用于显示文本内容
        nodeName.appendChild(doc.createTextNode(str(i[j])))
        
        #将各叶子节点添加到父节点Manager中,
        nodeManager.appendChild(nodeName)
    
      #最后将Manager添加到根节点Managers中
      root.appendChild(nodeManager)
    
    #开始写xml文档
    fp = open('d:\pylianxi\company11.xml', 'w',encoding='utf-8')
    doc.writexml(fp, indent='', addindent='	', newl='
    ', encoding="utf-8")
    fp.close()

     4、使用etree的方式解析xml文件

    #etree xml
    
    from xml.etree import ElementTree as ET

      '''
      直接解析XML文件并获得根节点

      tree = ET.parse(xmlFilePath)

      root = tree.getroot()
      解析字符串

      root = ET.fromstring(fp.read())
      '''

    tree=ET.ElementTree(file='d:\pylianxi\movies.xml')
    
    root=tree.getroot()
    
    #打印根节点的标签及属性字典
    print(root.tag)
    print(root.attrib)
    
    #获取子节点movie的标签及属性字典
    for i in root:
        print (i.tag)
        print ("********", i.attrib)
    
    print ("*"*50)
    print (root[0].tag)
    print (root[0].text)  #“打印的内容为一个回车”
    print (root[0][0].tag) #第一个movie节点的第一个子标签type
    print (root[0][0].text)
    
    print ("*"*50)
    for i in tree.iter():  #递归遍历所有子元素
        print (i.tag, i.attrib,i.text)
    
    print ("*"*50)
    for elem in tree.iterfind('movie/type'):#或者这种方式./movie/type查找movie下一级节点中的所有type标签,类似xpath查找
        print (elem.tag, elem.text)
    
    print ("*"*50)
    print(list(tree.iter(tag='stars')))
    for elem in tree.iter(tag='stars'):#在整个树中查找标签为stars的元素
        print (elem.tag, elem.text)
    
    
    print ("*"*50)
    for elem in tree.iterfind('*[@title="Ishtar"]'): #或者movie[@title="Ishtar"] 在下一级节点查找属性为title="Ishtar"的元素
        print (elem.tag, elem.attrib)
    
    print ("-"*50)
    root = tree.getroot()                #获取第一级movie元素
    print ("root:",root[0].tag  )          #打印第一级movie元素的标签,为movie
    print ("subnode:",root[0][0].tag)      #打印第一级movie元素下的第一个子元素标签type
    print ("subnode:",root[0][1].tag )     #打印第一级movie元素下的第二个子元素标签format
    print ("subnode:",root[0][2].tag )     #打印第一级movie元素下的第三个子元素标签year
    print ("subnode:",root[0][3].tag )     #打印第一级movie元素下的第四个子元素标签rating
    print ("subnode:",root[0][4].tag ) 
    
    del root[0][4] #删除第一级movie元素下的第五个子元素
    del root[0][3] #删除第一级movie元素下的第四个子元素
    del root[0][2] #删除第一级movie元素下的第三个子元素
    del root[0][1] #删除第一级movie元素下的第二个子元素
    
    del root[3] #删除第四个movie元素
    del root[2] #删除第三个movie元素
    
    for i in root:
        print(i.tag,i.attrib)
        for j in i:
            print('******',j.tag,j.text)
    #tree.write("d:\movies.xml")  #将变更的xml文件写入到文件中

    5、etree的方式生成xml

    #etree 生成一个xml
    
    a = ET.Element('elem')            #生成一个节点elem,没有文本节点
    aa = ET.SubElement(a, 'type')    #生成一个字节点下的子节点child1
    aa.text = "a的type子节点"              #在子节点上添加文本节点
    aa2 = ET.SubElement(a, 'name')    #生成一个字节点下的子节点child2
    aa2.text='a的name子节点'
    
    b = ET.Element('elem_b')          #生成一个节点elem_b,没有文本节点
    b.set('company','科技公司')
    bb=ET.SubElement(b,'type')
    bb.text='bb的type子节点'
    bb2=ET.SubElement(b,'name')
    bb2.text='bb的name子节点'
    
    root = ET.Element('root')         #生成一个节点root
    root.extend((a, b))               #将a、b两个变量存储的节点elem和elem1添加到root节点下
    tree = ET.ElementTree(root)       #生成节点树
    root[0].set('foo', 'bar')         #设定第一个子元素的属性foo,值为bar
    
    
    tree.write("d:\pylianxi\test.xml",encoding='utf-8')        #将xml文件内容写入到文本文件中,文件格式并不是很漂亮
  • 相关阅读:
    node 使用笔记
    体会 git 之优越性
    Notes for building gimp-print
    Selenium Books
    Using MongoDB in C#
    Learning coding online
    USING NHIBERNATE WITH MySQL
    Data Visualization Books
    Web Automation with Selenium (C#)
    Gearman In Action
  • 原文地址:https://www.cnblogs.com/xiaoxiao075/p/10741524.html
Copyright © 2011-2022 走看看