目前我正在尝试区分不同的序列化文本格式。主要在XBRL、XML、CSV和JSON之间。
我想假设,按步骤检查,如果我们使用解析器解析XBRL/XML并且返回时没有抛出任何异常,那么它是一个有效的XML文档,需要进一步检查该文档是常规XML还是XBRL。
如果第一次检查失败,请尝试解析csv。如果解析csv返回异常,则尝试将其解析为JSON。如果以上都不工作,则该文档无效。
这是识别文档文本格式类型的特殊方法吗?还是有更好的办法?(即读取文档的前几个字节等)。
谢谢
如果您知道JSON将是一个对象或数组,并且内容必须是这四个之一…
if(content.charAt(0) == "[" || content.charAt(0) == "{") {
// JSON
} else if(content.charAt(0) == "<") {
if(content.indexOf("xmlns="http://www.xbrl.org/2001/instance"") >= 0) {
// XBRL
} else {
// XML
}
} else {
// CSV ?...
// first remove strings
var testCSV = content.replace("""", ""); // remove escaped quotes
testCSV = testCSV.replace(/".*?"/g, ""); // match-remove quoted strings
var lines = testCSV.split("n");
if(lines.length === 1 && lines[0].split(",").length > 1) {
// only 1 row so we can only verify if there is two or more columns
// CSV
} else if(lines.length > 1 && lines[0].split(",").length > 1 && lines[0].split(",").length === lines[1].split(",").length) {
// we know there's multiple lines with the same number of columns
// CSV
}
// can't be sure what it is
// ???
}
以上将给你一个合理的确定性。
编辑我还添加了一个快速的CSV测试
我想具体说明XML和XBRL之间的区别。
XML是一个语法。XML解析器的任务可能是解析出元素,根据模式检查元素,并针对文档的结构执行其他语法级验证。在大多数情况下,解析XML是对文档结构的语法检查。
XBRL利用XML格式,因此所有XBRL文档也是XML文档。但是,XBRL规范超越了XML解析器,以确保以XML格式编码的数据的语义是正确的。例如,XBRL解析器加载计算链接库(如果定义了计算链接库),并确保参与计算的数值按计算链接库定义的那样正确地加起来。诸如Gepsio之类的工具执行这种特定于XBRL的语义检查工作,以确保以XML格式编码的数据符合XBRL规范中定义的所有规则。
XBRL是针对xml编码数据的语义规则。有效的XBRL也是有效的XML,但反过来不一定正确。XBRL已不再被用户视为一种"语言"。XBRL已经成为金融业务文档的语义标准。最初,XML被公司广泛采用,因为在那个时候JSON甚至还不存在(我们谈论的是90年代)。
今天,使用XML只是因为它能够创建大量的链接数据(通过XLinks、schema和linkbase)。但是,您并不局限于XML格式,您可以使用任何一种技术来表示XBRL文件:XML、JSON或CSV。
如果你已经有了XBRL-XML文件,你可以通过免费的开源工具将其转换为XBRL-JSON格式-例如:https://youtu.be/Xr6v4jL535w.