解析法律实体标识符(LEI)XML数据

时间:2018-01-06 01:25:47

标签: python xml

引入MiFID 2后,我想分析来自GLEIF的LEI数据。

数据是XML格式,但男孩!很难解析。

我尝试了代码(见下文),几乎完全冻结了我的机器,然后给出了这个错误:

AttributeError: no such child: {http://www.gleif.org/data/schema/leidata/2016}pyval. 

数据的结构非常简单,但文件很大。尽管如此,我认为主要的罪魁祸首是使用特殊字符,即标签中的冒号"lei:",请看这个缩短的例子:

<lei:LEIData xmlns:gleif="http://www.gleif.org/concatenated-file/header-extension/2.0" xmlns:lei="http://www.gleif.org/data/schema/leidata/2016">
    <lei:LEIRecords>
         <lei:LEIRecord>
              <lei:LEI>029200137F2K8AH5C573</lei:LEI>
         </lei:LEIRecord>
     </lei:LEIRecords>
</lei:LEIData>

有任何帮助吗?

我在删除lei:LEIHeader部分之后在pastebin上发布了一个更大的示例:https://pastebin.com/UbrM5mVp

请参阅下面的python代码(借鉴Wes McKinney的书,第6.1节):

from lxml import objectify
path = '20180104-gleif-concatenated-file-lei2.xml'
data = []
parsed = objectify.parse(open(path))
root = parsed.getroot()

for child in root:
    print(child.tag, child.attrib)

for elt in root.INDICATOR:
    el_data = {}
    for child in elt.getchildren():
        el_data[child.tag] = child.pyval
    data.append(el_data)

perf = pd.DataFrame(data)

1 个答案:

答案 0 :(得分:0)

有同样的问题:

import xmltodict

with open('LEIStuff.xml',encoding="utf8") as datafile:

doc = xmltodict.parse(datafile.read())

for row in doc['LEIData']['LEIRecords']['LEIRecord']:

    try:

        #Lei Number
        print(row['LEI'],'-----------------------------')
    except Exception:
                   pass

    try:
        #LegalNumber
        print(row['Entity']['LegalName']['#text'])
        print('===[LegalName]===')
    except Exception:
                   pass

[...]以及您想要使用的所有字段: 来自这个网站

https://www.gleif.org/en/about-lei/common-data-file-format/lei-cdf-format/lei-cdf-format-version-2-1

编辑:

AttributeError:没有这样的孩子 - LEI XML数据并不总是相同 - 每个记录的结构有点不同 - 有时候它和额外字段或缺少字段 - 我已经使用&#34; TRY:&#34;在python中,但每个字段必须按行完成(我认为)。

编辑ver2:

当你试图从连接的LEI文件中获取数据时,结构与小fies中的结构不同。

然后你可以使用:

for row in doc['lei:LEIData']['lei:LEIRecords']['lei:LEIRecord']:

但是当您尝试使用#text访问字段时:

LegalName =  row['lei:Entity']['lei:LegalName']['#text'] 

其他字段将是这样的:       Legal_PostalCode = row [&#39; lei:Entity&#39;] [&#39; lei:LegalAddress&#39;] [&#39; lei:PostalCode&#39;]

希望得到帮助。