zoukankan      html  css  js  c++  java
  • Python 解析含有命名空间(xmlns)的xml文件(基于ElementTree)

    Outline

    为什么会有命名空间?

    XML的元素名字是不固定的,当两个不同的文档,使用同样的名称描述两个不同类型的元素的时候,或者一个同样的标记表示两个不同含义的内容的时候,就会发生命名冲突。

    这时,命名空间是可以解决这个问题的;

    命名空间(Namespace),对于每一套特定应用的DTD,给它一个独一无二的标志来代表,如果在XML中使用DTD中定义的元素,需将 DTD的标志和元素名,属性连在一起使用,相当于指明了元素来自什么地方,这样就不会同其他同名元素混淆了。

    命名空间允许我们在一个文档中结合不同的元素和属性定义,并指明这些元素和属性的定义来自那里。
    命名空间语法结构:
    xmlns:[prefix]=”[url of name]”
    其中“xmlns:”是必须的属性。“prefix”是命名空间的别名,它的值不能为xml。
     <sample xmlns:ins=”http://www.lsmx.net.ac”>
       <ins:batch-list>
       <ins:batch>Evening Batch</ins:batch>
    </ins:batch-list>
         </sample>

    遇到的问题

    在用ElementTree解析xml时,一直很顺利,都能解析成功;但突然出现解析不出xml情况,文本编辑器打开xml文档发现里面是有内容的;
    仔细观察了下发现根标签中有一个 xmlns 属性,查了下原来是 命名空间, xml中有命名空间的情况下,获取子标签内容的话,就需要通过命名空间去唯一标识这个标签。

     现在知道xml文件中的xmlns了,剩下就是结合xmlns解析数据了;

    debug观察标签情况

    简单debug下,看下包含xmlns的标签是什么样子的;

     发现包含命名空间的xml,解析时(或者去定位标签时)标签的构成是:命名空间+标签名 

    解析数据

    通过上面操作已经知道当前xml文本的xmlns是什么了,所以就直接给标签拼接上xmlns,这样获取的内容就都是该命名空间下的内容了。

    import xml.etree.ElementTree as ET
    
    path = 'C:data美股数据GenInfo03_NA_i_20200609_1of1.xmlGenInfo_00B6F.xml'
    tree = ET.parse(path)
    # for i in tree.iter():
    #     print(i.tag)
    root = tree.getroot()
    namespace = '{urn:reuterscompanycontent:generalinformation03}'
    iter_root = root.iter(namespace + 'GeneralInformation')  # 直接给标签拼接上xmlns
    ret = []
    
    def get_xml_content(iter_root):
        """递归获取xml标签内容"""
        for node in iter_root:
            dic = node.attrib
            text = node.text
            if len(dic) == 0 and text == '
    ':
                pass
            else:
                dic['text'] = text
                t = node.tag.split('}')[-1]
                ret.append({t: dic})
            get_xml_content(node)
    
    
    get_xml_content(iter_root)

     参考信息

    How does XPath deal with XML namespaces?
  • 相关阅读:
    (1) C语言 基础1
    (5)数据契约
    hdu3592(差分约束) (线性)
    POJ3169 差分约束 线性
    BZOJ 3754 Tree之最小方差树 MST
    CodeForces788B 欧拉路
    【bzoj2152】聪聪可可 点分治
    POJ 1741 Tree【Tree,点分治】
    POJ3107 树的重心
    poj1655(dfs,树形dp,树的重心)(点分治基础)
  • 原文地址:https://www.cnblogs.com/bigtreei/p/13361578.html
Copyright © 2011-2022 走看看