zoukankan      html  css  js  c++  java
  • Python解析XML

    Python解析XML文件

    文本记录如何利用python解析XML文件:

    首先,XML示例文件如下所示(test.xml):

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <data>
      <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
      </country>
      <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
      </country>
      <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
      </country>
    </data>

    1. 导入解析XML文件的模块:xml.etree.ElementTree 

    import xml.etree.ElementTree  as ET

    注:解析XML方法很多,这里只介绍其一,xml.etree.ElementTree是按照XML文件的格式,将其看作树来解析。

    2. 解析步骤:

    (1) 实例化Element对象:

    tree = ET.ElementTree()

     可见直接调用ET模块的ElementTree方法返回一个Element对象,该对象指向XML树的根节点。

    现在来介绍Element对象的几个常用属性:

    • tag:获取该元素节点的标签。    比如根节点的标签是<data>,那么tree.tag返回的就是字符串data
    • attrib:获取噶元素节点的属性字典,没有属性就返回空字典。   比如元素标签为country的节点的属性为name='Liechetenstein'那么返回的就是字典{name : 'Liechetenstein'}
    • text:若该元素内没有再嵌套,那么返回的就是该元素的内容(类型视元素内容的类型而定)。    比如year元素调用text后返回的是2008

    (2)载入XML文件:

    上一步仅仅是创建了XML树的对象,其中没有内容,现在就要载入xml文件来使这颗XML树具有具体含义。

    tree.parse("test.xml")

    Element对象调用parse方法将xml文件载入进来,其中parse方法的参数便是xml文件的路径。

    这样,这颗xml树就要具体含义了,其含义与载入的xml文件含义同。

    (3) 现在开始操作xml树(操作xml文件的内容):

    1. 载入xml文件后的树是指向根节点的:

    print(tree.tag)

    输出:

    2. 可以使用len()函数查看该节点的子节点个数:

    print(len(tree))

    3. 可以按下标索引子节点:

    比如tree[0].tag的结果是country,意思是根节点的第一个子节点的标签是country

    4. Element对象的findall()方法:

    tree.findall('country')

    该方法接受参数为检索的元素标签(String类型),返回的是一个列表(列表中的每个值都是Element对象,即检索到的元素):

    比如:

    children = tree.findall('country')    # 调用方法findall,会在tree的子节点中寻找以country为标签的元素,将找到的元素放入列表中,最后返回这个列表
    for child in children:           # for循环遍历这个列表中的每个元素,循环体print语句输出每个元素的长度
        print(len(child))

     运行结果如下所示:(可以对比test.xml文件来理解输出)

     5. 也可以使用find()函数:

    child1 = tree[0]      # child1锁定到tree的第一个孩子结点
    print(child1.find('year').text)       # child.find('year')指向该节点的year元素,然后.text返回该元素的内容

    运行结果:(果然不出所料)

    一次性操作xml文件示范代码:

    childtag  = tree[0].tag             # 根目录的孩子结点的标签
    children = tree.findall(childtag)   # 返回所有根目录孩子结点元素的列表
    for child in children:              # 遍历该列表
        for i in range(len(child)):     # 获取每个孩子结点元素的长度,然后遍历输出所有内容
            print(child[i].tag + ':' + str(child[i].text))
        print()

    运行结果如下:

     

    (4)写XML文件

    import xml.etree.ElementTree as ET
    
    root = ET.Element('data')   # 创建根节点调用方法Element
    # 创建子节点用方法SubElement,其中第一个参数为他的父节点,第二个参数为该节点的标签
    # 第三个参数为该节点的属性(可选)
    student = ET.SubElement(root,'student',sex = 'boy')
    # 创建子节点,其父节点为student,用text来设置该节点的内容
    ET.SubElement(student,'name').text = 'Tony'
    ET.SubElement(student,'age').text = '22'
    # 与student节点同级的节点
    student = ET.SubElement(root,'student',sex = 'girl')
    ET.SubElement(student,'name').text = 'Tina'
    ET.SubElement(student,'age').text = '21'
    # xml的写工作完成后调用ElementTree方法创建一颗xml树
    # 其参数为Element类型,即这颗树的根
    tree = ET.ElementTree(root)
    # ElementTree对象调用write方法,将数写入到xml文件中
    # 第一个参数为文件路径,第二个参为编码格式(记得写)
    tree.write('test.xml',encoding='utf-8')

    运行结果如下:

     

    ----------------------------------------------------------  参考API ---------------------------------------------------------------

    1.函数

    1.xml.etree.ElementTree.Comment(text=None):注释元素工厂,这个工厂函数创建一个特殊的元素,将被序列化为XML注释标准的序列化器。注释字符串可以是bytestring或Unicode字符串,文本是包含注释字符串的字符串,返回表示注释的元素实例。

    注意:XMLParser忽略了输入中的注释,而不是为它们创建注释对象。如果ElementTree使用其中一个元素方法插入到树中,它只会包含注释节点。

    2.xml.etree.ElementTree.dump(elem):把元素树或元素结构写入sys.stdout。这个函数只用于调试。

    3.xml.etree.ElementTree.fromstring(text):从字符串常量解析XML,XML()方法解析的方式也一样,它们返回的都是一个Element实例。

    4.xml.etree.ElementTree.iselement(element):检查对手是否是有效的element对象,如果是element对象返回true,否则返回false.

    5.xml.etree.ElementTree.iterparse(source, events=None, parser=None):在元素树中逐步解析XML,并且报告用户的情况。资源是文件名或包含xml数据的文件对象。一系列的事件需要被报告,支持事件的字符串有 “start”, “end”, “start-ns” and “end-ns”,如果忽略事件,则只报告“end”事件。解析器是一个可选的解析器实例。如果没有给出,则使用标准的XMLParser解析器。解析器必须是XMLParser的子类,并且只能使用默认的TreeBuilder作为目标。使用iterparse()函数返回一个迭代器对象。

    6.xml.etree.ElementTree.parse(source, parser=None):把XML文件解析成 element tree,资源是一个文件名或包含XML数据的文件对象,解析器是一个可选的解析器实例。如果没有指定parser的参数值,默认使用的是XMLParser解析器。调用此函数返回ElementTree实例对象。

    7.xml.etree.ElementTree.ProcessingInstruction(target, text=None):返回一个元素实例,表示一个处理指令。

    8.xml.etree.ElementTree.register_namespace(prefix, uri):注册命名空间前缀, registry是全局的,任何现有的前缀或名称空间URI的映射都将被删除。这个命名空间中的标签和属性将被给定的前缀给序列化。

    9.xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra):此函数是一个Subelement工厂,这个函数用于创建 element 实例,并将其添加到现有的 element 中。

    10.xml.etree.ElementTree.tostring(element, encoding=”us-ascii”, method=”xml”, *, short_empty_elements=True): 转化为字符串。
    01.element:表示一个element实例
    02. encoding:默认编码是”us-ascii”
    03.method:默认是”xml”,可以选择“html”、“text”

    11.xml.etree.ElementTree.tostringlist(element, encoding=”us-ascii”, method=”xml”, *, short_empty_elements=True):转化成字符串列表。

    12.xml.etree.ElementTree.XML(text, parser=None):
    01.text :包含xml数据的字符串。
    02.parser:解析器默认是XMLParser
    03.返回的是一个Element实例

    13.xml.etree.ElementTree.XMLID(text, parser=None):返回一个包含Element实例和字典的元组。

    2.Element 对象

    class xml.etree.ElementTree.Element(tag, attrib={}, **extra)

    1.tag: 标签
    2.text: 去除标签,获得标签中的内容。
    3.attrib: 获取标签中的属性和属性值。
    4.tail: 这个属性可以用来保存与元素相关联的附加数据。它的值通常是字符串,但可能是特定于应用程序的对象。

    Element 对象的方法

    1.clear():清除所有子元素和所有属性,并将文本和尾部属性设置为None。

    2.get(attribute_name, default=None):通过指定属性名获取属性值。

    3.items():以键值对的形式返回元素属性。

    4.keys():以列表的方式返回元素名。

    5.set(attribute_name,attribute_value):在某标签中设置属性和属性值。

    6.append(subelement):将元素子元素添加到元素的子元素内部列表的末尾。

    7.extend(subelements):追加子元素。

    8.find(match, namespaces=None):找到第一个匹配的子元素,match可以是标签名或者path。返回Elememt实例或None。

    9.findall(match, namespaces=None):找到所有匹配的子元素,返回的是一个元素列表。

    10.findtext(match, default=None, namespaces=None):找到匹配第一个子元素的文本。返回的是匹配元素中的文本内容。

    11.getchildren():Python3.2后使用 list(elem) 或 iteration.

    12.getiterator(tag=None):Python3.2后使用 Element.iter()

    13.iter(tag=None):以当前元素为根创建树迭代器。迭代器遍历这个元素和它下面的所有元素(深度优先级)。如果标签不是None或’*’,那么只有标签等于标签的元素才会从迭代器返回。如果在迭代过程中修改树结构,则结果是未定义的。

    14.iterfind(match, namespaces=None):匹配满足条件的子元素,返回元素。

    15.itertext():创建一个文本迭代器。迭代器循环遍历此元素和所有子元素,以文档顺序,并返回所有内部文本。

    16.makeelement(tag, attrib):此方法使用SubElement()函数代替。

    17.remove(subelement):删除子元素。

    3.ElementTree 对象

    class xml.etree.ElementTree.ElementTree(element=None, file=None):

    ElementTree是一个包装器类,这个类表示一个完整的元素层次结构,并为标准XML的序列化添加了一些额外的支持。

    1._setroot(element):替换根元素,原来的根元素中的内容会消失。

    2.find(match, namespaces=None):从根元素开始匹配和 Element.find()作用一样。

    3.findall(match, namespaces=None):从根元素开始匹配和 Element.findall()作用一样。

    4.findtext(match, default=None, namespaces=None):从根元素开始匹配和 Element.findtext()作用一样。

    5.getiterator(tag=None):Python3.2后使用 ElementTree.iter() 代替。

    6.iter(tag=None):迭代所有元素

    7.iterfind(match, namespaces=None):从根元素开始匹配和 Element.iterfind()作用一样。

    8.parse(source, parser=None):解析xml文本,返回根元素。

    9.write(file, encoding=”us-ascii”, xml_declaration=None, default_namespace=None, method=”xml”, *, short_empty_elements=True):写出XML文本。

  • 相关阅读:
    URAL1966 Cipher Message 3
    hdu5307 He is Flying
    UVA12633 Super Rooks on Chessboard
    spoj-TSUM Triple Sums
    bzoj3160 万径人踪灭
    bzoj2194 快速傅立叶之二
    FFT NTT 模板
    NOI2009 植物大战僵尸
    最长k可重线段集问题
    最长k可重区间集问题
  • 原文地址:https://www.cnblogs.com/thisyan/p/9699939.html
Copyright © 2011-2022 走看看