# Efficient XML Interchange

Efficient XML Interchange (EXI) ist ein vom World Wide Web Consortium (W3C) vorgeschlagenes Format für die binäre Repräsentation von XML Information Sets. Im Vergleich zu textbasierten XML-Dokumenten können Dokumente im EXI-Format schneller verarbeitet werden und benötigen weniger Bandbreite beim Transfer über ein Netzwerk. Neben EXI gibt es weitere Ansätze eine binäre Repräsentation für XML zu etablieren (vgl. Binary XML).

## Geschichte

Auf Basis der Schlussfolgerungen der XML Binary Characterization Working Group wurde im November 2005 die Efficient XML Interchange (EXI) working Group gegründet, mit dem Ziel ein binäres Beschreibungsformat für XML zu definieren. Nach Analyse und Vergleich mehrerer Ansätze (u. a. XML+gzip, Fast Infoset, Fujitsu Binary, Xebu und esXML) wurde im November 2006 Efficient XML als Basis für EXI gewählt. Im Juli 2007 wurde der erste Entwurf für den Efficient XML Interchange standard veröffentlicht.
Die Planung der Arbeitsgruppe sah es vor, EXI im September 2009 als W3C-Empfehlung zu veröffentlichen. Im Januar 2011 wurde dann ein Vorschlag für eine W3C-Empfehlung und im März 2011 die darauf aufbauende W3C-Empfehlung publiziert. Im Februar 2014 wurde eine 2te Edition veröffentlicht.
Im November 2016 hat die Arbeitsgruppe ihren Namen von „Efficient XML Interchange (EXI)“ zu „Efficient Extensible Interchange (EXI)“ geändert um der breiten Anwendbarkeit des Formates Rechnung zu tragen.

## Konzept

Der Algorithmus verwendet eine Grammatik, um anhand dieser zu bestimmen, was wahrscheinlich an einer bestimmten Stelle in einem XML-Dokument vorkommt. Die wahrscheinlichste Alternative wird dann mit weniger Bits kodiert als unwahrscheinlichere (vgl. Entropiekodierung). Dieser allgemein gehaltene Algorithmus kann auf jede Sprache, die von einer Grammatik beschrieben wird (z. B. SVG, Java, HTML usw.), angewendet werden. EXI ist für XML-Sprachen optimiert, das EXI4JSON-Beispiel zeigt wiederum die Anwendbarkeit des Verfahrens auf JSON-Dokumente.
Die Grammatik erlaubt als Eingabe ein beliebiges XML-Dokument oder Fragmente davon. Um genauere Vorhersagen treffen zu können, was an einer bestimmten Stelle vorkommt, kann die Grammatik durch verschiedene Schemata (z. B. DTD oder XML Schema) erweitert werden.
Der Encoder erzeugt, unter Zuhilfenahme der Grammatik, aus der Eingabe einen Stream of Events (englisch für „Strom der Ereignisse“), der aus einer Reihe von einfachen Codes variabler Länge besteht. Diese Event Codes ähneln Huffman-Kodierungen, sind aber viel einfacher zu berechnen und zu pflegen. Zusätzlich können die Event Codes durch Lauflängenkodierung komprimiert werden.

## Magische Zahl

Um EXI-Streams von XML-Streams zu unterscheiden, wurden zwei Unterscheidungs-Bits eingeführt. Die ersten zwei Bits des ersten Oktetts müssen die Werte ‚1‘ und ‚0‘ in genau der Reihenfolge haben. Diese Reihenfolge ist in wohlgeformten XML-1.0-Dokumenten in den üblichen Zeichenkodierungen nicht möglich. Um aber die Unterscheidung auch für mögliche zukünftige Kodierungen zu gewährleisten, wurde schon früh die Einführung eines magic cookie vorgeschlagen.
In der Spezifikation zum Format 1.0 wird festgelegt, dass der EXI-Header mit dem so genannten EXI-Cookie, der ASCII-Zeichenfolge $EXI (0x24455849), beginnen kann. Unmittelbar darauf müssen die zwei Unterscheidungs-Bits folgen. Bis auf die ersten zwei und das vierte Bit des ersten Oktetts (nach dem EXI-Cookie) sind die anderen fünf variabel. Daraus ergeben sich theoretisch 32 verschiedene magische Zahlen.
Zwar ist die Verwendung des EXI-Cookies optional, sie wird aber in der Spezifikation dringend empfohlen.

### Beispiel

Ein EXI-Stream der Version 1 mit EXI-Cookie und ohne EXI-Optionen würde mit folgenden Bytes beginnen:
Ein EXI-Stream ab der Version 16 mit EXI-Cookie und EXI-Optionen würde wie folgt beginnen:

## Implementierungen

Auf der Webseite der Interchange Working Group findet man eine ausführliche Beschreibung der Implementierungen.
* EXIficient: Ein von Siemens unterstütztes Open-Source-Projekt zur Implementation der EXI-Spezifikation in Java, C/C++, JavaScript.
* Efficient XML: Eine durch die Firma AgileDelta kommerziell vertriebene Implementierung der EXI-Spezifikation in Java, .NET und C++
* OpenEXI: Ein von Fujitsu, Naval Postgraduate School (NPS) und OptimaLogic vorangetriebenes Open-Source-Projekt zur Implementation der EXI-Spezifikation in Java.
* Exi-Connexion - Open Source Implementation des EXI Working Draft vom 26. März 2008.
* EXIP: Open-Source-Projekt von der Universität Luleå in C.
* OSS EXI Tools von OSS Nokalva in C/C++ und .NET