2008-09-09 5 views
25

Für mich verwendbar bedeutet:Welche verwendbaren Alternativen zur XML-Syntax kennen Sie?

  • es in real-Wold hat
  • verwendet wird ist es Tools unterstützen. (Zumindest einig einfacher Editor)
  • es hat die Menschen lesbare Syntax (keine spitzen Klammern bitte)

Auch ich will es so nahe wie möglich zu XML sein, dh es muss Unterstützung für Attribute sein sowie für Eigenschaften. Also bitte keine YAML. Momentan fällt mir nur eine passende Sprache ein - JSON. Kennst du noch andere Alternativen?

+8

JSON stimmt nicht überein. Es unterstützt keine Attribute und Eigenschaften. – rjmunro

+4

Holen Sie sich einen Stift und Papier, und versuchen Sie, eine Syntax zu modellieren, die Attribute, Elemente und Hierarchie unterstützt. Jetzt sehen Sie, wie leserlich Ihre Versuche sind. –

+0

@basel: Sie werden dann Python – makapuf

Antwort

49

YAML ist eine 100% Obermenge von JSON, daher ist es nicht sinnvoll, YAML abzulehnen und stattdessen JSON zu betrachten. YAML tut alles, was JSON tut, aber YAML gibt auch so viel mehr (wie Referenzen).

Ich kann nicht an etwas denken, das XML tun kann, das YAML nicht kann, außer, um ein Dokument mit einer DTD zu validieren, die meiner Erfahrung nach den Aufwand nie wert gewesen ist. Aber YAML ist so viel schneller und einfacher zu tippen und zu lesen als XML. Wenn Sie darüber nachdenken, fügen sie nichts wirklich "hinzufügen" hinzu ... es ist nur eine Notationsverknüpfung, um etwas als ein Attribut des Knotens zu schreiben, anstatt es in sein eigenes Kind zu schreiben.

Knoten. Aber wenn Sie diese Bequemlichkeit mögen, können Sie es oft mit YAMLs Inline-Listen/Hashes emulieren. ZB:

<!-- 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} 

Für mich ist der Luxus nicht zweimal jeden Knoten-Tag zu schreiben, mit der Freiheit von allen Winkelbügel Wurf kombiniert macht YAML eine bevorzugte Wahl. Ich mag auch das Fehlen von formalen Tag-Attributen, da mir das immer wie ein grauer Bereich von XML vorkam, der unnötigerweise zwei Sätze von Syntax (sowohl beim Schreiben als auch beim Traversieren) für im Wesentlichen das gleiche Konzept einführte. YAML räumt mit dieser Verwirrung ganz auf.

+0

Angenommen, Ihre Semantik benötigt kein Kind? I.e. Sie wollten Elemente haben eine Liste von Kindern wie oder vielleicht andere Ereignisse im Leben des Regisseurs (zB ..). YAML kann das nicht tun, ohne eine sinnlose zusätzliche Ebene zu erstellen - in Ihrem Fall . Ich kann Situationen sehen, in denen du diese Art von Dingen willst und wo YAML in adäquater oder verbaler Form ist. Es ist auch, was das OP tatsächlich gesagt hat, dass sie wollten. –

13

ist eine sehr gute Alternative, und es gibt Tools dafür in mehreren Sprachen. Und es ist wirklich einfach in Web-Clients zu verwenden, da es natives Javascript ist.

+1

Ich habe JASON schon erwähnt, kennst du eine Alternative dazu? – aku

3

Ich würde JSON empfehlen ... aber da Sie es bereits erwähnt haben, sollten Sie vielleicht einen Blick auf Google protocol buffers werfen.

Edit: Protokollpuffer werden verwendet, um programmatisch verwendet werden (es gibt Bindungen für C++, Java, Python ...), so dass sie möglicherweise nicht für Ihren Zweck geeignet sind.

+0

Ich habe von Google-Protokollpuffern gehört, aber ich habe mir nie die Mühe gemacht, einen Blick darauf zu werfen. Hattest du irgendwelche Erfahrungen mit diesem Google-Kram? – aku

+0

Keine praktische Erfahrung. Wir verwenden JSON bei der Arbeit, aber ich hatte die Dokumente der Google-Protokollpuffer ein wenig gelesen und dachte, dass sie es wert sein könnten, wenn JSON nicht genug geeignet sein wird. – Pat

+0

Protokollpuffer haben eine sehr –

2

Ich denke Clearsilver ist eine sehr gute Alternative. Sie haben sogar eine Vergleichsseite here und eine Liste von projects, die es verwenden

5

Jeff dieser schrieb über here und here. Das sollte dir helfen, loszulegen.

3

Sie sind Forderungen sind ein bisschen unmöglich .. Sie wollen etwas in der Nähe von XML, aber wahrscheinlich die nächste Entsprechung, die keine Winkel-Klammer (YAML) haben.

So sehr ich es nicht mag, warum nicht einfach XML verwenden? Du solltest eigentlich niemals XML lesen müssen (abgesehen vom Debugging, nehme ich an), dafür gibt es eine absurde Menge an Tools.

So ziemlich alles, was nicht XML ist, wird nicht so weit verbreitet sein, daher wird es weniger Werkzeugunterstützung geben.

JSON ist wahrscheinlich in etwa gleichwertig, aber es ist genauso unlesbar. Aber noch einmal, Sie sollten es nie wirklich lesen (laden Sie es in die Sprache, die Sie verwenden, und es sollte in native Arrays umgewandelt werden/dicts/Variablen/was auch immer).

Oh, ich JSON finden weit schöner als XML zu analysieren: Ich habe es in Javascript verwendet habe, und die simplejson Python-Modul - etwa ein Befehl, und es ist schön in eine native Python dict umgewandelt oder ein Javascript-Objekt (daher der Name!)

+0

Bitte lesen Sie meine Frage sorgfältig. YAML unterstützt das Attribut überhaupt nicht. – aku

+4

AFAIK, noch JSON, aber Ihre Frage sagt, dass JSON eine gültige Alternative für Ihre Verwendung ist. – rjmunro

0

AFAIK, JSON und YAML ist genau gleichwertig in der Datenstruktur Bedingungen. YAML hat nur weniger Klammern und Anführungszeichen und so. Ich sehe also nicht, wie du die eine ablehnst und die andere behälst.

Auch sehe ich nicht, wie XML-Klammern sind weniger "menschlich lesbar" als JSONs eckige Klammern, geschweifte Klammern und Anführungszeichen.

+0

Als eine Person, die Tonnen dieser Klammern geschrieben hat, kann ich sagen, dass es einen RIESIGEN Unterschied gibt. Sie wissen nicht, wie sich YAML von XML unterscheidet, bitte lesen Sie die im Fragetext verlinkten Wikipedia-Artikel. – aku

+3

Ich weiß, wie YAML und XML unterschiedlich sind.Was ich nicht weiß, ist, wie sich YAML und JSON unterscheiden, außer dass ersteres für Menschen lesbarer ist, aber Sie lehnen es ab, und das letztere hat eckige Klammern, geschweifte Klammern und Anführungszeichen, und Sie sagten, es sei OK. – rjmunro

5

Ich habe S-Expressions gefunden, um eine gute Möglichkeit, strukturierte Daten darzustellen. Es ist ein sehr einfaches Format, das einfach zu generieren und zu parsen ist. Es unterstützt keine Attribute, aber wie YAML & JSON, muss es nicht. Attribute sind einfach eine Möglichkeit für XML, die Ausführlichkeit einzuschränken. Einfachere, sauberere Formate brauchen sie einfach nicht.

0

Es gibt wirklich viele Alternativen zu XML, aber das Hauptproblem bei vielen von ihnen scheint zu sein, dass Bibliotheken nicht für jede Sprache der Wahl verfügbar sind und die Bibliotheken relativ umständlich zu implementieren sind.

Das Parsen einer Baumstruktur selbst ist im Vergleich zu Schlüssel/Wert-Paaren, z. Hashtabellen. Wenn eine Hashtabelleninstanz die Anforderung erfüllt, dass alle ihre Schlüssel Zeichenfolgen sind und alle ihre Werte Zeichenfolgen sind, ist es relativ mühsam, hashtable2string() und string2hashtable() zu implementieren.

Ich habe die Hash-Tabelle Serialisierung in AJAX zwischen PHP und JavaScript benutzen und das Format, das ich entwickelt habe, ist ProgFTE (Programmierer Freundlich Text Exchange) bezeichnet und beschrieben unter:

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

Man kann eine Ruby-Version der ProgFTE Implementierung im Rahmen der Kibuvits Ruby-Bibliothek finden: http://rubyforge.org/projects/kibuvits/

1

YAML ist extrem voll funktionsfähige und menschenlesbaren Format im allgemeinen, aber es ist Achilles ist heile Komplexität wie durch den Rails v demonstriert Unzulänglichkeiten, die wir diesen Winter gesehen haben. Aufgrund seiner Allgegenwart in Ruby als Config-Sprache trat Tom Preston-Werner von Github Fame auf, um eine vernünftige Alternative namens TOML zu kreieren. Es hat sofort massive Traktion bekommen und hat eine großartige Werkzeugunterstützung. Ich empfehle jedem empfehlen, bei YAML suchen, check it out:

https://github.com/mojombo/toml

2

Für Code wie Speichern von Daten, LES (Loyc Expression Syntax) eine angehende Alternative.Ich habe eine Menge Leute für die Code-ähnliche Konstrukte verwenden XML bemerkt, wie Build-Systeme, die Conditionalen Befehl Anrufungen, manchmal sogar Schleifen unterstützen. Diese Art von Dingen natürlich aussehen in 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; 
    } 
); 

Es hat keine große Werkzeugunterstützung noch, obwohl; Derzeit ist die einzige LES-Bibliothek für C#. Derzeit ist nur eine App bekannt, die LES verwendet: LLLPG. Es unterstützt "Attribute", aber sie sind wie C# -Attribute oder Java-Annotationen, nicht XML-Attribute.

Theoretisch könnten Sie LES für Daten oder Markup verwenden, aber es gibt keine Standards dafür, wie das zu tun:

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 }; 
3

Es gibt AXON, die das Beste von XML und JSON decken. Lassen Sie uns das in mehreren Beispielen erklären.

AXON könnte als kürzere Form von XML-Daten in Betracht gezogen werden.

XML

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

AXON

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

oder

person 
    name: 
    "Frank Martin" 
    age: 
    32 

XML

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

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

oder

person 
    name: "Frank Martin" 
    age: 32 

AXON enthält eine Form von JSON.

JSON

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

AXON

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

AXON kann Kombination von XML-like und JSON-ähnliche Daten darstellen.

AXON

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) 
    } 
} 

Es ist die Python-Bibliothek pyaxon jetzt verfügbar.

4

TL; DR

Prolog wurde hier nicht erwähnt, aber es ist das beste Format Ich kenne für Daten darstellt. Prolog-Programme beschreiben im Wesentlichen Datenbanken mit komplexen Beziehungen zwischen Entitäten. Prolog ist tot - einfach zu analysieren, wessen wahrscheinlich einziger Rivale S-Ausdrücke in diesem Bereich sind.

Vollversion

Programmierer oft "vergessen", was XML tatsächlich besteht. Bezieht sich normalerweise auf eine sehr kleine Teilmenge von dem, was es ist.XML ist ein sehr komplexes Format mit mindestens diesen Teilen: DTD schema language, XSD schema language, XSLT transformation language, RNG schema language und XPath (plus XQuery) Sprachen - sie alle sind Teil des XML-Standards. Außerdem gibt es einige Apokryphen wie E4X. Jeder von ihnen hat seine eigenen Versionen, einige Überschneidungen, Inkompatibilitäten usw. Sehr wenige XML-Parser in der Wildnis implementieren sie alle. Ganz zu schweigen von den zahlreichen Eigenheiten und Fehlern der beliebten Parser, von denen einige zu bemerkenswerten Sicherheitsproblemen wie https://en.wikipedia.org/wiki/XML_external_entity_attack führen.

Daher ist die Suche nach einem XML Alternative keine sehr gute Idee. Sie möchten wahrscheinlich überhaupt nicht mit XML umgehen.

YAML ist wahrscheinlich die zweitschlechteste Option. Es ist nicht so groß wie XML, aber es wurde auch entworfen, um alle Grundlagen zu überdecken ... mehr als zehn Mal ... auf unterschiedliche und einzigartige Weise, die niemand je erdenken könnte. Ich habe noch von einem richtig funktionierenden YAML-Parser gehört. Ruby, die Sprache, die viel YAML verwendet, hatte berühmt screwed up wegen ihm. Alle YAML-Parser, die ich bis jetzt gesehen habe, sind Kopien von libyaml, die selbst eine Art handschriftlicher Parser sind, mit einem Code, der sehr schwer auf Korrektheit zu überprüfen ist (Funktionen, die Hunderte umfassen) von Linien mit verschachtelten Kontrollfluss). Wie bereits erwähnt, enthält es JSON vollständig ... zusätzlich zu einer Handvoll Unicode-Codiertechniken ... im selben Dokument und wahrscheinlich eine Menge anderer Sachen, von denen Sie nichts hören wollen.

JSON, auf der anderen Seite, ist völlig anders als die anderen beiden. Sie können wahrscheinlich einen JSON-Parser schreiben, während Sie auf das Herunterladen von JSON-Parser-Artefakten von Ihrem Maven-Nexus warten. Es kann sehr wenig tun, aber zumindest weißt du, was es kann. Keine Überraschungen. (Außer einigen Diskrepanzen in Bezug auf Zeichen entkommen in Strings und verdoppelt Codierung). Keine verdeckten Exploits. Sie können keine Kommentare darin schreiben. Mehrzeilige Strings sehen schlecht aus. Was auch immer Sie unter Unterscheidung zwischen Eigenschaften und Attributen meinen, können Sie durch verschachtelte Wörterbücher implementieren.

Angenommen, Sie wollten Recht haben, was XML schadete ... nun, das beliebte Zeug wie YAML oder JSON wird es nicht tun. Irgendwie trennten sich Mode und rationales Denken Mitte der siebziger Jahre. Also musst du mit McCarthy, Hoare, Codd und Kowalski dahin zurückgehen, wo alles begann, herausfinden, was du darstellst, und dann sehen, was die beste Darstellungsmethode für das ist, was du bist versuchen zu repräsentieren :)

+0

Sehr gute Antwort, danke. – ferit

Verwandte Themen