xml解析模块

Posted FuZZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xml解析模块相关的知识,希望对你有一定的参考价值。

XML

XML是可扩展标记语言的缩写,是实现不同语言或程序之间进行数据交换的协议,主要可以对key添加属性. 页面做展示(字符类型的一个xml格式数据)\\做配置文件(内部xml格式的数据).,每一个节点都是一个element对象
格式:

<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2023</year>
        <gdppc>141100</gdppc>
        <neighbor direction="E" name="Austria" />
        <neighbor direction="W" name="Switzerland" />
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2026</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia" />
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2026</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica" />
        <neighbor direction="E" name="Colombia" />
    </country>
</data>

 

python解析xml

python有三种方法解析XML,SAX,DOM,以及ElementTree:

  • SAX (simple API for XML ) python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
  • DOM(Document Object Model) 将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
  • ElementTree(元素树)
    ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
    注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)

    使用elementtree解析xml

    • 测试文件: War, Thriller DVD 2003 PG 10 Talk about a US-Japan war Anime, Science Fiction DVD 1989 R 8 A schientific fiction Anime, Action DVD 4 PG 10 Vash the Stampede! Comedy VHS PG 2 Viewable boredom ```
  • 解析xml

    • 使用ElementTree.XML将字符串解析为xml对象
    from xml.etree import ElementTree as ET
    
    # 打开文件,读取XML内容
    xml_str = open(\'test.xml\',\'r\',encoding=\'utf-8\').read()
    
    将字符串解析成xml特殊对象,root代指xml文件的根节点
    root = ET.XML(xml_str)

     

    • 使用ElementTree.parse将文件直接解析问xml对象
    from xml.etree import ElementTree as ET
    
    #直接解析xml文件
    tree = ET.parse(\'test.xml\')
    # 获取xml文件的根节点
    root = tree.getroot()

     

  • ElementTree常用的方法:

    • 属性

      • tag:string,元素代表的数据种类。
      • text:string,元素的内容。
      • tail:string,元素的尾形。
      • attrib:dictionary,元素的属性字典。
    • 针对属性的操作

      • clear():清空元素的后代、属性、text和tail也设置为None。
      • get(key, default=None):获取key对应的属性值,如该属性不存在则返回default值。
      • items():根据属性字典返回一个列表,列表元素为(key, value)。
      • keys():返回包含所有元素属性键的列表。
      • set(key, value):设置新的属性键与值。
    • 针对后代的操作

      • append(subelement):添加直系子元素。
      • extend(subelements):增加一串元素对象作为子元素。#python2.7新特性
      • find(match):寻找第一个匹配子元素,匹配对象可以为tag或path。
      • findall(match):寻找所有匹配子元素,匹配对象可以为tag或path。
      • findtext(match):寻找第一个匹配子元素,返回其text值。匹配对象可以为tag或path。
      • insert(index, element):在指定位置插入子元素。
      • iter(tag=None):生成遍历当前元素所有后代或者给定tag的后代的迭代器。#python2.7新特性
      • iterfind(match):根据tag或path查找所有的后代。
      • itertext():遍历所有后代并返回text值。
      • remove(subelement):删除子元素。
      • getroot():获取根节点.
  • 打印xml信息

from xml.etree import ElementTree as ET

tree = ET.parse(\'test.xml\')
root = tree.getroot()
print(root.tag)           #打印根标签

for i in root:
    print(i.tag,i.attrib)    #打印第二层节点的标签名称和属性

for i in root.iter(\'format\'):     #循环打印所有format的标签,并打印名字和内容
    print(i.tag,i.text)
  
  
  
  
输出结果:
collection
movie {\'title\': \'Enemy Behind\'}
movie {\'title\': \'Transformers\'}
movie {\'title\': \'Trigun\'}
movie {\'title\': \'Ishtar\'}
format DVD
format DVD
format DVD
format VHS

 

  • 修改xml内容
from xml.etree import ElementTree as ET

tree = ET.parse(\'test.xml\')
root = tree.getroot()

for i in root.iter(\'year\'):        #循环所有的year ,然后修改 值,并添加属性
    new_year = int(i.text) + 10
    node.txt = str(new_year)
    i.set(\'test\',\'testadd\')      #添加属性 test 值为testadd

 

  • 保存xml
#解析xml文件方式 使用write()方法可直接保存
tree.write("new.xml", encoding=\'utf-8\')

#解析字符串方式,需将当前root转换为
tree = ET.ElementTree(root)
tree.write("new.xml", encoding=\'utf-8\')

 

  • 创建xml文件
from xml.etree import ElementTree as ET

#创建节点
root = ET.Element("father")   #创建一个root根节点    
child1 = ET.Element(\'child1\',tag=\'大儿子\' ,attrib={\'name\':\'儿子1\',\'年龄\':\'22\'})
  #创建一个child1节点
child2 = ET.Element(\'child2\',tag=\'小儿子\' ,attrib={\'name\':\'儿子2\',\'年龄\':\'10\'})
   #创建一个child2街店    

grandson1 = ET.Element(\'grandson1\')  #创建一个grandson1节点
grandson2 = ET.Element(\'grandson2\')  #创建一个grandson2节点

#节点逻辑堆加
child1.append(grandson1)   #把grandson1加入到child1的下,成为其子节点
child2.append(grandson2)

root.append(child1)
root.append(child2)

#保存xml到文件
tree = ET.ElementTree(root)
tree.write(\'xxoo.xml\',encoding=\'utf-8\', short_empty_elements=False)
方法1
from xml.etree import ElementTree as ET

root = ET.Element("father")
child1 = root.makeelement(\'child1\',{\'name\':\'儿子1\',\'年龄\':\'22\'})
child2 = root.makeelement(\'child2\',{\'name\':\'儿子2\',\'年龄\':\'10\'})

grandson1 = child1.makeelement(\'grandson1\',{})
grandson2 = child2.makeelement(\'grandson2\',{})
#节点逻辑堆加
child1.append(grandson1)   #把grandson1加入到child1的下,成为其子节点
child2.append(grandson2)

root.append(child1)
root.append(child2)

#保存xml到文件
tree = ET.ElementTree(root)
tree.write(\'xxoo.xml\',encoding=\'utf-8\', short_empty_elements=False)
方法2
from xml.etree import ElementTree as ET


# 创建根节点
root = ET.Element("father")


# 创建大儿子
child1 = ET.SubElement(root, " 大儿子", attrib={\'name\':\'儿子1\',\'年龄\':\'22\'})
# 创建小儿子
child2 = ET.SubElement(root, "小儿子", attrib={\'name\':\'儿子1\',\'年龄\':\'22\'})

# 在大儿子中创建一个孙子
grandson1 = ET.SubElement(child1,"grandson1")
grandson2 = ET.SubElement(child2,"grandson2")


et = ET.ElementTree(root)  #生成文档对象
et.write("xxoo.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)
方法3

 

创建的xml文档:

<father><child1 name="儿子1" 年龄="22"><grandson1></grandson1></child1><child2 name="儿子2" 年龄="10"><grandson2></grandson2></child2></father>

 

由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式:
from xml.etree import ElementTree as ET
from xml.dom import minidom


def prettify(elem):
    """将节点转换成字符串,并添加缩进。
    """
    rough_string = ET.tostring(elem, \'utf-8\')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent="\\t")

root = ET.Element("father")

child1 = root.makeelement(\'child1\',{\'name\':\'儿子1\',\'年龄\':\'22\'})
child2 = root.makeelement(\'child2\',{\'name\':\'儿子2\',\'年龄\':\'10\'})

grandson1 = child1.makeelement(\'grandson1\',{})
grandson2 = child2.makeelement(\'grandson2\',{})

child1.append(grandson1)
child2.append(grandson2)

root.append(child1)
root.append(child2)

#tree = ET.ElementTree(root)
#tree.write(\'xxoo.html\',encoding=\'utf-8\', short_empty_elements=False)
raw_str = prettify(root)

f = open("xxoo.xml",\'w\',encoding=\'utf-8\')
f.write(raw_str)
f.close()

 

效果:

<?xml version="1.0" ?>
<father>
    <child1 name="儿子1" 年龄="22">
        <grandson1/>
    </child1>
    <child2 name="儿子2" 年龄="10">
        <grandson2/>
    </child2>
</father>

 

以上是关于xml解析模块的主要内容,如果未能解决你的问题,请参考以下文章

无法解析片段中的 findViewById [重复]

jsoup解析xml某片段的问题

为 Blogger 上的博客格式化代码片段 [关闭]

java解析xml的几种方式哪种最好?

使用非utf-8编码在Python中解析XML

Perl,如何解析 XML 文件,xpath