zoukankan      html  css  js  c++  java
  • Python解析xml文件

    1. 背景说明?

      解析 xml 格式的文件有多种方法, 这里只介绍使用 xml.etree.ElementTree 这种解析方式.

    2. ElementTree 和 cElementTree 的区别?

      ElementTree在 Python 标准库中有两种实现。一种是纯 Python 实现例如 xml.etree.ElementTree ,另外一种是速度快一点的 xml.etree.cElementTree 。你要记住: 尽量使用 C 语言实现的那种,因为它速度更快,而且消耗的内存更少。

      注意: 开发的时候为了调试方便, 可以使用 ElementTree .

    3. 解析方式?

      导入包:  python3.3之后ElementTree模块会自动寻找可用的C库来加快速度

    try:
        import xml.etree.cElementTree as et
    except ImportError:
        import xml.etree.ElementTree as et

      3.1 方式一: 读取 xml 文件成 xml 对象

    # 从某文件解析成 xml 对象:
    tree_obj = et.parse( "city_info.xml" )
    
    # 获取根节点元素
    root = tree_obj.getroot()

      3.2 方式二: 读取 xml 字符串成 xml 对象

    # 注意: xml 格式开头的 <?xml version......  一定不能有空格, 否则报错!!!
    xml_text = """<?xml version="1.0" encoding="UTF-8"?>
    <struts>
        <action name="login" class="com.coderising.litestruts.LoginAction">
            <result name="success">homepage.jsp</result>
            <result name="fail">showLogin.jsp</result>
        </action>
        <action name="logout" class="com.coderising.litestruts.LogoutAction">
           <result name="success">welcome.jsp</result>
           <result name="error">error.jsp</result>
        </action>
    </struts>
    """
    
    # 获取很节点元素
    root = et.fromstring(xml_text)

      3.3 解析各元素获取信息

      获取属性值和文本信息

    # xml_text, 即上面的xml字符串
    
    root = et.fromstring(xml_text)
    for action in root.iter("action"):
        act_name = action.attrib.get("name")    # 获取属性值
        class_info = action.get("class")        # 同样也是获取标签属性值, 上面的简写方式
        for result in action.iter("result"):
            res_name = result.get("name")
            res_text = result.text              # 获取标签文本信息

      find 方法 + xpath 解析式 (注意: xpath解析式不支持绝对路径, 仅支持相对路径, 比如 "./")

        find(): 查找满足条件的第一个标签

        findall(): 查找满足条件的所有标签

    root = et.fromstring(xml_text)
    
    # find() 查找第一个标签
    action = root.find(".//action/result[2]")
    print(action.get("name"))        # fail
    print(action.text)               # result 1.2 result 1.2 result 1.2 result 1.2
    
    
    # findall() 查找所有标签
    actions = root.findall(".//action/result")
    for action in actions:
        ac_name = action.get("name")
        ac_text = action.text
  • 相关阅读:
    Discuz! 的编码规范
    Golang 并发编程指南
    Hyrum's Law
    从数组中将变量导入到当前的符号表
    map[interface {}]interface {} yaml文件解码
    迪基福勒检验
    约定式路由
    use of internal package github.com/gokratos/kratos/v2/internal/httputil not allowed
    See https://v8.dev/blog/mathrandom for details.
    Cast a value as a certain type
  • 原文地址:https://www.cnblogs.com/bk9527/p/11437539.html
Copyright © 2011-2022 走看看