用 JS 解析 XBRL 文件

Parse XBRL file with JS

我想解析 XBRL 文件,例如这个 one thus I found 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);
});

然而 returns 只是以下内容:

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.

我怀疑文件本身有问题,因为它直接来自美国证券交易委员会,而且我已经测试了多个不同的文件(每个文件的结果都一样乏善可陈),因此要么我的代码不正确,要么npm 模块已过时或有故障。因此,我的问题是,我应该使用的正确代码是什么,或者我应该使用的正确 npm 模块是什么(如果有的话)。

非常感谢任何帮助。

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

据我从文档中了解到,该模块有两个功能:

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

上面的代码片段正在调用 parseStr,但作为字符串传递的 XBRL 实例看起来不正确:它是一个空元素,它将 Apple 文件的位置作为名称传递space 声明,并且在 xbrli:xbrl 之后和名称 space 绑定之前缺少 space (这使其成为非名称 space-格式良好的 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 年第四季度)的内容复制并粘贴到模块的 Web interface,但它似乎不接受它作为 XML/XBRL,尽管如您正确所述,此实例确实是正确且有效的 XBRL。我设法让它只与实例的一个子集一起工作(只有第一个上下文和 DEI 事实),所以可能有一个错误要报告。

我遇到了 .parseFile 无法正常工作的相同问题,所以我想出了一个巧妙的解决方法:

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


var XML = "";


request
.get('https://www.sec.gov/Archives/edgar/data/320193/000162828016020309/aapl-20160924.xml')
.on('response', function(response) {
   response.on('data', function(chunk){
       XML += chunk;
   });
   response.on('end',function(){
       ParseXbrl.parseStr(XML).then(function(parsedDoc) {
       console.log(parsedDoc);
       });
   });
});

在这里,我使用 HTTP 请求获取 XML,然后让 XBRL 模块将该数据解析为字符串。

对于看到这篇文章的其他人,我是作者,所以我想澄清一些困惑。我错误地将第一个函数记录为 parseFile,实际名称是 parse。我已经更新了自述文件是正确的。此函数不会通过 https 加载文档(尽管这将是一个很大的改进),它希望文件以硬拷贝形式存在。至于在接受的文档格式上不是很灵活,欢迎 prs。我使用的测试文件都取自SEC edgar网站