在python中解析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
解决方法:
不在乎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(已压缩并应首先解压缩).
lxml和名称空间
lxml可以很好地与名称空间配合使用.它允许您使用使用命名空间的XPath表达式.通过控制输出的namspace前缀,它有点复杂,因为它依赖于xmlns属性,而xmlns属性是序列化文档的一部分.如果要修改前缀,则必须以某种方式组织这些xmlns属性,通常是将所有都移动到根元素.同时,lxml会跟踪每个元素的完全限定名称空间,因此在序列化时,它将尊重该全名以及该名称空间的当前有效前缀.
处理这些xmlna属性需要更多代码,请参阅lxml文档.
标签:xml-namespaces,xbrl,xml,python 来源: https://codeday.me/bug/20191121/2054000.html