2017-08-10 92 views
2

我想解析XBRL文件,比如这个one因此我发现this npm模块,声称能够解析XBRL文件。这是我实现的示例代码:用JS解析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. 

我有我的怀疑,有一些错误的doocument本身,因为它是直接从美国证券交易委员会并且由于我测试了多个不同的文档(每个文档都有相同的低效结果),因此我的代码不正确,或者npm模块过时或出错。因此,我的问题是,我应该使用的正确代码是什么,或者说,我应该使用什么正确的npm模块(如果有的话)。

任何帮助,非常感谢。

+0

你确定模块是否安装在本地? – Programah

+0

是的,我通过IDE运行我的代码,并通过命令提示符安装我的模块 – BWP

回答

3

我有同样的问题。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模块解析数据为字符串。

+0

嗨,我只想对你表示感谢,没有你,我的项目就不可能实现。 – BWP

1

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

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

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

上面的代码中被调用parseStr,但作为一个字符串传递的XBRL实例看起来不正确的:它是一个空元素,它通过苹果文件的位置作为一个命名空间声明,并且在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的Q4 for 2016)复制并粘贴到模块的Web interface中,但它似乎并不接受它作为XML/XBRL,尽管如此,作为你正确地说,这个实例确实是正确和有效的XBRL。我设法使它只与实例的一个子集一起工作(只有第一个上下文和DEI的事实),所以可能会有一个错误报告。

+0

对不起,打扰你多一点,但是当我尝试使用.parseFile我得到了'TypeError:ParseXbrl.parseFile'不是一个函数,即使我复制和粘贴代码,我仍然可以做到。我重新安装了模块,但取得了相同的结果。 – BWP

+0

我很乐意提供帮助。我在我身边也遇到了同样的错误,这就是为什么我只能在XBRL/API级别提供帮助。我看到CoderMan27找到了解决方案,非常好! –

1

对于其他人看到这个,我是作者,所以我想澄清一些混淆。我错误地将第一个函数记录为parseFile,实际的名称是解析。我已将自述更新为正确。此功能不会通过https加载文档(虽然这将是一个很好的增强功能),但它期望文件作为硬拷贝存在。至于在接受的文件格式方面不够灵活,prs欢迎。我使用的测试文件全部来自SEC edgar网站。