使用JS解析XBRL文件

时间:2017-08-10 23:44:34

标签: javascript node.js npm xbrl

我想解析这个one之类的XBRL文件,因此我找到了this npm模块声称能够解析XBRL文件。这是我对示例代码的实现:

var ParseXbrl = require('parse-xbrl');

ParseXbrl.parseStr('<?xml version="1.0" encoding="US-ASCII"?> <xbrli:xbrlxmlns:aapl="https://www.sec.gov/Archives/edgar/data/320193/000162828016020309/aapl-20160924.xml">').then(function(parsedString) {
console.log(parsedString);
});

但是它只返回以下内容:

Field not found. is not a date
loaded EntityRegistrantName: Field not found.
loaded CurrentFiscalYearEndDate: Field not found.
loaded EntityCentralIndexKey: Field not found.
loaded EntityFilerCategory: Field not found.
loaded TradingSymbol: Field not found.
loaded DocumentPeriodEndDate: Field not found.
loaded DocumentFiscalYearFocus: Field not found.
loaded DocumentFiscalPeriodFocus: Field not found.
loaded DocumentFiscalYearFocusContext: Field not found.
loaded DocumentFiscalPeriodFocusContext: Field not found.
loaded DocumentType: Field not found.
Unhandled rejection No year end found.

我怀疑文档本身有什么问题,因为它直接来自SEC,因为我测试了多个不同的文档(每个文档都有相同的乏味结果),因此我的代码不正确或者npm模块已过时或有缺陷。因此,我的问题是,我应该使用的正确代码是什么,或者是什么,我应该使用的正确的npm模块(如果有的话)是什么。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

(免责声明:虽然我熟悉XBRL,但我不熟悉这个特定的库。)

根据我从文档中理解的内容,该模块有两个功能:

  • parseFile ,它获取XBRL实例的位置
  • parseStr ,它将实际XBRL实例(具有XML格式)的内容作为字符串获取

上面的代码片段正在调用 parseStr ,但是作为字符串传递的XBRL实例看起来不正确:它是一个空元素,它将Apple文件的位置作为名称空间声明和空格传递在xbrli:xbrl之后和命名空间绑定之前丢失(这使得它成为非命名空间良好的XML)。

我的印象是模块的意图是使用parseFile代替,如下所示:

var ParseXbrl = require('parse-xbrl');

ParseXbrl.parseFile('https://www.sec.gov/Archives/edgar/data/320193/000162828016020309/aapl-20160924.xml').then(function(parsedDoc) {
  // Use results...
});

这假设它能够通过Web获取实例。否则,实例(aapl-20160924.xml)可能应该在本地复制,而parseFile则用本地文件位置调用(在文档页面上,这是一个相对文件位置)。

另一种方法是调用parseStr并复制并粘贴aapl-20160924.xml内容作为参数,但我认为这不是最佳做法传递如长字符串,特别是因为它可能包含单引号(这个实例确实包含一些)。

作为最后的评论,我尝试将此实例的内容(Apple的2016年Q4)复制并粘贴到模块的Web interface中,但它似乎并不接受它作为XML / XBRL,甚至但是,正如您所说的那样,这个实例确实是正确且有效的XBRL。我设法使它只与实例的一个子集一起工作(只有第一个上下文和DEI事实),所以可能有一个错误需要报告。

答案 1 :(得分:1)

对于其他任何人看到这一点,我是作者,所以我想澄清一些困惑。我错误地将第一个函数记录为parseFile,实际名称是parse。我已将自述文件更新为正确。此功能不会通过https加载文档(虽然这将是一个很好的增强),它希望该文件作为硬拷贝存在。如果在接受的文件格式中不是非常灵活,请欢迎。我使用的测试文件都来自SEC edgar网站。