【问题标题】:Differentiating XBRL, XML, CSV, and JSON区分 XBRL、XML、CSV 和 JSON
【发布时间】:2015-09-08 08:06:20
【问题描述】:

目前我正在尝试区分不同的序列化文本格式。主要在 XBRL、XML、CSV 和 JSON 之间。

我想假设,按步骤检查,如果我们使用解析器解析 XBRL/XML 并返回而没有抛出任何异常,那么它是一个有效的 XML 文档,需要进一步检查以查看该文档是否是常规的xml 或 xbrl。

如果第一次检查失败,请尝试解析 csv。如果解析 csv 返回异常,请尝试解析为 JSON。如果以上方法均无效,则为无效文档。

这是一种识别文档文本格式类型的特殊方法吗?或者,还有更好的方法? (即读取文档的前几个字节等...)。

谢谢

【问题讨论】:

  • 可能某些数据可以用不止一种方式解释(例如,双引号中的单个字符串可能是有效的 CSV 有效的 JSON),但在这种情况下无论如何,没有“完美”的答案。如果可以使用任何有效格式,那么读取几个字节并相应地对测试进行排序(例如,lota < 建议先尝试 XML)将节省时间——只需使用第一个不给出异常的格式。最后请注意,CSV 有许多“参数”(例如引用类型、是否允许嵌入换行符等)——IOW 存在大量略微不兼容的 CSV 格式。 :(

标签: json xml algorithm csv xbrl


【解决方案1】:

如果您知道 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 测试。

【讨论】:

  • 我相信内容将是 4 种选择之一。但是,如果我们要考虑内容不是这四个之一的可能性,我们应该怎么做呢?我曾想过使用 JSON、XML 和 CSV 解析器来解析文档。如果所有三个解析器都失败了,我们会抛出一个异常,说明文档不是其中一种格式。但我仅限于 Java 库中可用的内容,不能使用任何其他外部库进行解析。我相信有一个内置的 JSON 和 XML 解析器,但还没有 CSV 解析器。
  • @sincreadys - 验证 CSV 格式并不难,我添加了一些代码来演示。 CSV 规范中最棘手的部分是如何处理字符串和引号,所以我首先使用简单的替换删除它们,然后使用非贪婪的正则表达式来匹配周围的引号和字符串内容。删除所有字符串后,我们只需在换行符处拆分,每行以逗号(列分隔符)拆分。现在只需确保每行包含相同数量的列(符合 CSV 规范)。我的代码只测试了前两行,但你可以通过循环更彻底
【解决方案2】:

我想特别说明一下 XML 和 XBRL 之间的区别。

XML 是一种语法。 XML 解析器的任务可能是解析元素,根据模式检查元素,并针对文档结构执行其他语法级别的验证。在大多数情况下,解析 XML 是对文档结构的语法检查。

XBRL 利用 XML 格式,因此所有 XBRL 文档也是 XML 文档。但是,XBRL 规范超越了 XML 解析器,以确保以 XML 格式编码的数据的语义是正确的。例如,XBRL 解析器会加载计算链接库(如果已定义),并确保参与计算的数值按照计算链接库的定义正确相加。 Gepsio 等工具执行此特定于 XBRL 的语义检查工作,以确保以 XML 格式编码的数据符合 XBRL Specification 中定义的所有规则。

XBRL 是针对 XML 编码数据的语义规则。有效的 XBRL 也是有效的 XML,但反过来不一定正确。

【讨论】:

    【解决方案3】:

    XBRL 不再被用户视为一种“语言”。 XBRL 已成为金融业务文档的语义标准。最初,XML 被公司广泛采用,因为当时甚至不存在 JSON(我们谈论的是 90 年代)。

    今天,使用 XML 仅仅是因为它可以创建大量链接数据(通过 XLink、模式和链接库)。但是,您不会停留在 XML 格式中,您可以使用以下任何一种技术来表示 XBRL 文件:XMLJSONCSV

    如果您已有 XBRL-XML 文件,您可以通过免费和开源工具将其转换为 XBRL-JSON 格式 - 例如:https://youtu.be/Xr6v4jL535w

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      相关资源
      最近更新 更多