代码之家  ›  专栏  ›  技术社区  ›  aku

您知道哪些可用的XML语法替代方案?[闭门]

  •  25
  • aku  · 技术社区  · 17 年前

    为了我 实用的

    • 它正在现实世界中使用
    • 它有工具支持。(至少是一些简单的编辑器)
    • 它有人类可读的语法(请不要尖括号)

    YAML 请目前,我只想到一种匹配的语言- JSON . 你知道其他的选择吗?

    14 回复  |  直到 8 年前
        1
  •  55
  •   asthasr    15 年前

    YAML是JSON的100%个超集,所以拒绝YAML并考虑JSON是没有意义的。YAML做JSON所做的一切,但YAML也提供了更多(如引用)。

    除了用DTD验证文档之外,我想不出任何XML可以做YAML做不到的事情,在我的经验中,DTD从来都不值得这样做。但是YAML比XML更快、更容易输入和读取。

    <!-- XML -->
    <Director name="Spielberg">
        <Movies>
            <Movie title="Jaws" year="1975"/>
            <Movie title="E.T." year="1982"/>
        </Movies>
    </Director>
    
    
    # YAML
    Director: 
        name: Spielberg
        Movies:
          - Movie: {title: E.T., year: 1975}
          - Movie: {title: Jaws, year: 1982}
    

    对我来说,不必两次写入每个节点标记的奢侈,再加上不受任何角度限制的自由,使得YAML成为首选。实际上,我也喜欢缺少正式的标记属性,因为在我看来,这就像是XML的灰色区域,不必要地为本质上相同的概念引入了两组语法(在编写和遍历时)。亚姆完全消除了这种困惑。

        2
  •  13
  •   Staale    17 年前
        3
  •  8
  •   Community Mohan Dere    6 年前

    TL;博士

    这里没有提到Prolog,但它是我所知道的表示数据的最佳格式。Prolog程序本质上描述数据库,实体之间有复杂的关系。Prolog解析起来非常简单,它可能唯一的竞争对手就是这个领域中的S表达式。

    完整版本

    程序员常常“忘记”XML实际上由什么组成。通常指它是什么的一个非常小的子集。XML是一种非常复杂的格式,至少包含以下部分: DTD schema language , XSD schema language , XSLT transformation language , RNG schema language XPath (加上XQuery)语言——它们都是XML标准的重要组成部分。另外,还有一些类似伪经的故事 E4X . 它们中的每一个都有自己的版本、相当多的重叠、不兼容等。在野外很少有XML解析器实现所有这些。更不用说流行解析的多种怪癖和错误了,其中一些导致了显著的安全问题,如 https://en.wikipedia.org/wiki/XML_external_entity_attack .

    因此,寻找XML 可供替代的

    YAML可能是第二糟糕的选择。它没有XML那么大,但它的设计也试图覆盖所有基础。。。每次超过十次。。。以不同和独特的方式,任何人都无法想象。我还没有听说YAML解析器能够正常工作。Ruby,一种经常使用YAML的语言,有着著名的 screwed up 因为它。到目前为止,我看到的所有YAML解析器都是 libyaml ,它本身是一种手写的(不是从形式描述生成的)解析器,其代码的正确性很难验证(使用复杂的控制流跨越数百行的函数)。如前所述,它完全包含JSON。。。在一些Unicode编码技术的基础上。。。在同一份文件中,可能还有一些你不想听的东西。

    假设,尽管您想纠正XML的错误。。。好吧,那么像YAML或JSON这样流行的东西就不行了。在70年代中期的某个时候,时尚和理性思维在编程中分道扬镳。所以,你必须回到麦卡锡、霍尔、科德和科瓦尔斯基开始的地方,找出你想要表达的是什么,然后看看你想要表达的东西的最佳表达技巧是什么:)

        4
  •  6
  •   Ferruccio    15 年前

    我找到了 S-Expressions

        5
  •  5
  •   Giovanni Galbo    17 年前

    杰夫写了这篇文章 here here . 这应该能帮助你开始。

        6
  •  4
  •   dbr    17 年前

    你的要求有点不可能。。您想要接近XML的东西,但可能会拒绝没有尖括号(YAML)的最接近的等价物。

    尽管我不喜欢它,为什么不直接使用XML呢?您不应该真正地阅读XML(我想除了调试之外),它有大量的工具。

    几乎所有非XML的东西都不会得到广泛的应用,因此工具支持会减少。

    JSON可能是等效的,但它几乎同样不可读。。但同样,您不必实际读取它(将它加载到您正在使用的任何语言中,并应将其转换为本机数组/dicts/变量/任何内容)。

    哦,我确实找到了JSON 远的 解析比解析XML更好:我在Javascript和simplejson Python模块中使用了它——大约一个命令,它被很好地转换为本机Python dict或Javascript对象(因此命名!)

        7
  •  4
  •   intellimath    7 年前

    AXON 这涵盖了XML和JSON的优点。让我们用几个例子来解释这一点。

    AXON可以看作是XML数据的较短形式。

    XML

    <person>
       <name>Frank Martin</name>
       <age>32</age>
     </person>
    

    轴突

    person{
      name{"Frank Martin"}
      age{32}}
    

    person
      name:
        "Frank Martin"
      age:
        32
    

    XML

    <person name="Frank Martin" age="32" />
    

    轴突

    person{name:"Frank Martin" age:32}
    

    person
      name: "Frank Martin"
      age: 32
    

    JSON

    {"name":"Frank Martin" "age":32 "birth":"1965-12-24"}
    

    {name:"Frank Martin" age:32 birth:1965-12-24}
    

    AXON可以表示类XML和类JSON数据的组合。

    table {
      fields {
        ("id" "int") ("val1" "double") ("val2" "int") ("val3" "double")
      }
      rows {
        (1 3.2 123 -3.4)
        (2 3.5 303 2.4)
        (3 2.3 235 -1.2)
      }
    }
    

    table
      fields
        ("id" "int")
        ("val1" "double")
        ("val2" "int") 
        ("val3" "double")
      rows
        (1 3.2 123 -3.4)
        (2 3.5 303 2.4)
        (3 2.3 235 -1.2)
    

    python库中有可用的 pyaxon 现在

        8
  •  3
  •   Pat    17 年前

    我推荐JSON。。。但是既然你已经提到了,也许你应该看看 Google protocol buffers

    编辑:协议缓冲区被编程使用(有C++、java、python……的绑定),因此它们可能不适合你的目的。

        9
  •  2
  •   epatel    17 年前

    我想 Clearsilver 这是一个很好的选择。他们甚至有一个比较页 here projects 那就用它吧

        10
  •  2
  •   Alex Nolasco    9 年前

    用于存储类似于数据的代码, LES

    // LES code has no built-in meaning. This just shows what it looks like.
    [DelayedWrite]
    Output(
        if version > 4.0 {
            $ProjectDir/Src/Foo;
        } else {
            $ProjectDir/Foo;
        }
    );
    

    不过,它还没有强大的工具支持;目前唯一的LES库是用于C#。目前已知只有一个应用程序使用LES: LLLPG . 它支持“属性”,但它们类似于C#属性或Java注释,而不是XML属性。

    理论上,您可以将LES用于数据或标记,但对于如何做到这一点没有标准:

    body {
        '''Click here to use the World's '''
        a href="http://google.com" {
            strong "most popular"; " search engine!"
        };
    };
    
    point = (2, -3);
    tasteMap = { "lemon" -> sour; "sugar" -> sweet; "grape" -> yummy };
    
        11
  •  1
  •   David Crow    17 年前

    HDF (ClearSilver),以及 OGDL

    在谷歌搜索了一下之后,我还在这里找到了一个备选方案列表:
    http://web.archive.org/web/20060325012720/www.pault.com/xmlalternatives.html

        12
  •  1
  •   gtd    13 年前
        13
  •  0
  •   rjmunro    17 年前

    AFAIK、JSON和YAML在数据结构方面完全等效。YAML只是少了一些括号和引号之类的东西。所以我不明白你是如何拒绝一个而保留另一个的。

    此外,我不明白XML的尖括号如何比JSON的方括号、花括号和引号更不“人类可读”。

        14
  •  0
  •   Martin Vahi    13 年前

    确实有很多替代XML的方法,但其中许多方法的主要问题似乎是库可能不适用于每种选择的语言,而且库的实现相对比较困难。

    如果与键值对(例如哈希表)相比,解析树结构本身可能不是那么令人愉快。如果哈希表实例满足其所有键都是字符串且其所有值都是字符串的要求,那么实现hashtable2string()和string2hashtable()相对来说并不费力。

    http://martin.softf1.com/g/n//a2/doc/progfte/index.html

    您可以在Kibuvits Ruby库中找到ProgFTE实现的Ruby版本: http://rubyforge.org/projects/kibuvits/