zoukankan      html  css  js  c++  java
  • 【python】lxml处理命名空间

    有如下xml

    <A xmlns="http://This/is/a/namespace">
        <B>dataB1</B>
        <B>dataB2</B>
        <B>
            <C>dataC</C>
        </B>
    </A>

    其中的xmlns属性表示的是该xml的默认命名空间,该命名空间必须是一个url形式

    查看xml的tag

    #encoding=utf8
    
    from lxml import etree
    
    str_xml = """
    <A xmlns="http://This/is/a/namespace">
        <B>dataB1</B>
        <B>dataB2</B>
        <B>
            <C>dataC</C>
        </B>
    </A>
    """
    
    xml = etree.fromstring(str_xml)
    for node in xml.iter():
        print node.tag

    结果为:

    {http://This/is/a/namespace}A
    {http://This/is/a/namespace}B
    {http://This/is/a/namespace}B
    {http://This/is/a/namespace}B
    {http://This/is/a/namespace}C

    可以看到,跟普通xml的tag相比每个tag前面都多出了一个命名空间

    获取命名空间  .nsmap

    from lxml import etree
    
    str_xml = """
    <A xmlns="http://This/is/a/namespace">
        <B>dataB1</B>
        <B>dataB2</B>
        <B>
            <C>dataC</C>
        </B>
    </A>
    """
    
    xml = etree.fromstring(str_xml)
    ns = xml.nsmap
    print ns
    print ns[None]

    结果

    {None: 'http://This/is/a/namespace'}
    http://This/is/a/namespace

    ns[None]获取的是默认命名空间,ns会显示所有的命名空间

    获取有命名空间的节点内容

    from lxml import etree
    
    str_xml = """
    <A xmlns="http://This/is/a/namespace">
        <B>dataB1</B>
        <B>dataB2</B>
        <B>
            <C>dataC</C>
        </B>
    </A>
    """
    
    xml = etree.fromstring(str_xml)
    ns = xml.nsmap[None]
    ns = "{%s}" % ns
    for item in xml.findall("{0}B/{0}C".format(ns)): #不能用xpath会出错
        print item.text

    结果

    dataC

    注意,在查找节点时,每一级节点都需要加上命名空间。而且测试时发现,findall可以正常查找到信息,而xpath会报错。

    获取带命名空间节点的属性值

    from lxml import etree
    
    str_xml = """
    <A xmlns="http://This/is/a/namespace">
        <B b="123">dataB1</B>
        <B>dataB2</B>
        <B>
            <C>dataC</C>
        </B>
    </A>
    """
    
    xml = etree.fromstring(str_xml)
    ns = xml.nsmap[None]
    ns = "{%s}" % ns
    
    item = xml.find(ns+"B")
    print item.get("b")
    print item.text

    结果

    123
    dataB1

    可以看到,获取属性时,不需要加命名空间,直接获取即可

  • 相关阅读:
    一周自学动态站点设计
    【甘道夫】Apache Hadoop 2.5.0-cdh5.2.0 HDFS Quotas 配额控制
    linux系统管理命令--系统测试工具
    Atitit.异步编程 java .net php python js 对照
    项目开发经常使用PHP功能
    它们的定义app.config中间section节点和在执行中使用
    Android 它们的定义ListView实现底部和页下拉刷新刷新的顶
    vs2012连接sql2008(错误类型:Could not load file or assembly)
    管理不,因为你不是说经理
    java编程接口(5) ------ button和button组
  • 原文地址:https://www.cnblogs.com/dplearning/p/5954005.html
Copyright © 2011-2022 走看看