在python中解析xbrl文件

时间:2014-05-15 18:43:39

标签: python xml xml-namespaces xbrl

我正在开发一个xml解析器。 目标是解析许多不同的xml文件,其中前缀和标记保持一致,但名称空间更改

我正在尝试:

  • 仅通过<prefix:tags>解析xml,而不用命名空间解析(替换)前缀。前缀在文档之间保持不变。
  • 自动加载命名空间,以便可以用适当的命名空间替换标识符(<prefix:tag>)。
  • 只需通过标记解析xml

我尝试了xml.etree.ElementTree

我也看过lxml 我没有找到lxml中XMLParser的任何配置选项可以帮助我,虽然here我可以读一个答案,其中作者建议lxml应该能够为我收集名称空间自动。

有趣的是,parsed_file = etree.XML(file)因错误而失败:

lxml.etree.XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1

我要解析的文件的一个示例是here

2 个答案:

答案 0 :(得分:2)

不关心ns前缀,关心完整的命名空间

有时,人们会关心那些短前缀和遗忘,这是次要的。它们只是对完全限定名称空间的简短引用。例如。

xmlns:trw="http://www.trw.com/20131231"
xml中的

表示从现在开始,"trw:"代表完全限定的名称空间"http://www.trw.com/20131231"。请注意,此前缀可以重新定义到任何后续元素中的任何其他命名空间,并且可能具有完全不同的含义。

另一方面,当您关心真正的意义,这意味着完全限定的命名空间,您可以将"trw:row"视为"{http://www.trw.com/20131231}row"。这种翻译的含义将是可靠的,并且不会随着前缀的改变而改变。

解析引用xml

指向http://edgar.sec.gov/Archives/edgar/data/1267097/000104746914000925/trw-20131231.xml的链接会生成一个xml,该{xml会按xmlstarlet进行验证,lxml可以解析。

您显示的错误消息是指流的第一个字符,因此您可能在文件中遇到BOM字节,或者您正在尝试读取xml,这是gzip并应首先解压缩。

lxml和名称空间

lxml可以很好地处理命名空间。它允许您使用使用命名空间的XPath表达式。通过在输出上控制namspace前缀,它有点复杂,因为它依赖于xmlns属性,它们是序列化文档的一部分。如果要修改前缀,则必须以某种方式组织这些xmlns属性,通常是将所有属性移动到根元素。同时,lxml跟踪每个元素的完全限定名称空间,因此在序列化时,它将遵循此全名以及此命名空间的当前有效前缀。

处理这些xmlna属性需要更多代码,请参阅lxml文档。

答案 1 :(得分:1)

items = tree.xpath("*[local-name(.) = 'a_tag_goes_here']")

完成了这项工作。最重要的是,我必须手动浏览生成的列表items以定义我的其他所需过滤功能。