Пример Java для кодирования / декодирования EXI?

Я ищу образец программы на Java для кодирования / декодирования потоков EXI (Efficient XML Interchange) с использованием EXIficient или OpenEXI.

Может ли кто-нибудь помочь? Я не могу найти пример приложения.

изменить: в качестве альтернативы, если кто-то может указать мне на документацию, которая позволит мне использовать EXIficient или OpenEXI, это было бы полезно. Я нашел Javadoc, но я не знаю, какие классы использовать.

Или, как указывает @StaxMan, есть ли особые упоминания / обсуждения соответствующих классов верхнего уровня для использования с одним из стандартных API-интерфейсов XML?

5 ответов

Используя Exificient, мне удалось зашифровать и декодировать образец XML в виде EXI, используя фрагмент их страницы "Справка" и их "демо", мне удалось получить следующую работу, используя только зависимость Maven

<dependency>
    <groupId>com.siemens.ct.exi</groupId>
    <artifactId>exificient</artifactId>
    <version>0.9.4</version>
</dependency>

с кодом

import com.siemens.ct.exi.EXIFactory;
import com.siemens.ct.exi.GrammarFactory;
import com.siemens.ct.exi.api.sax.EXIResult;
import com.siemens.ct.exi.api.sax.EXISource;
import com.siemens.ct.exi.helpers.DefaultEXIFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;


// based on: https://sourceforge.net/p/exificient/code/HEAD/tree/tags/exificient-0.9.4/src/sample/java/EXIficientDemo.java?format=raw
public class MinimalistExificientSample {

    static final boolean USE_SCHEMA = true;

    public static void main(String[] args) throws Exception{
        File xmlIn  = new File( "/home/artb/spring-core-4.1.6.RELEASE.pom.xml" );
        FileInputStream xmlIns = new FileInputStream( xmlIn );

        File exi = new File( "/home/artb/spring-core-4.1.6.RELEASE.pom." +(USE_SCHEMA? "schema":"schemaless")+  ".exi" )
        FileOutputStream exiOuts = new FileOutputStream( exi );

        File xmlOut  = new File( "/home/artb/spring-core-4.1.6.RELEASE.pom." +(USE_SCHEMA? "schema":"schemaless")+ ".xml" );

        //settings
        EXIFactory exiFactory = DefaultEXIFactory.newInstance();
        exiFactory.setGrammars( GrammarFactory.newInstance().createGrammars( "/home/artb/maven-4.0.0.xsd" ) );

        // encode
        InputSource xmlIs = new InputSource( xmlIns );
        EXIResult exiResult = USE_SCHEMA ? new EXIResult(exiFactory) : new EXIResult();
        exiResult.setOutputStream( exiOuts );
        XMLReader xmlReader = XMLReaderFactory.createXMLReader();
        xmlReader.setContentHandler( exiResult.getHandler() );
        xmlReader.parse( xmlIs );

        // decode
        FileOutputStream xmlOuts = new FileOutputStream( xmlOut );
        FileInputStream exiIns = new FileInputStream( exi );
        InputSource exiIs = new InputSource( exiIns );
        EXISource exiSource = USE_SCHEMA ? new EXISource(exiFactory) : new EXISource();
        exiSource.setInputSource(exiIs);
        exiSource.setXMLReader( exiSource.getXMLReader() );
        TransformerFactory.newInstance().newTransformer().transform(exiSource, new StreamResult(xmlOuts));
    }

}

используйте Maven XSD и Spring 4.1.6 POM от Maven central в качестве типовых данных.

Обратите внимание: что выходной XML должен быть эквивалентен входному, но не обязательно должен совпадать, поскольку комментарии и пробелы теряются, а псевдонимы пространства имен (? Может быть, здесь используется неправильный термин) произвольно назначаются.

Я не знаком с двумя упомянутыми библиотеками; но я предполагаю, что, как и любые здравомыслящие библиотеки XML, они реализуют один из хорошо известных API обработки Java Java, например SAX, Stax или DOM (возможно, с некоторыми расширениями). Это потому, что EXI - это просто другая кодировка стандартного XML Infoset; поэтому для разработчика приложений все может выглядеть как обычная обработка XML.

Итак, вам может понадобиться выяснить API, которые они реализуют, и найти учебные пособия по использованию этого API?

Способ использования OpenEXI описан ниже, где шаги 2 и 3 являются необязательными.

  1. Используйте EXISchemaFactory в пакете org.openexi.fujitsu.scomp для преобразования XML-схем в EXISchema.
  2. Сериализация EXISchema в файл.
  3. Загрузите EXISchema из файла.
  4. Создайте GrammarCache в пакете org.openexi.fujitsu.proc.grammars, указав EXISchema для конструктора.
  5. Создайте экземпляр Transmogrifier в пакете org.openexi.fujitsu.sax и установите GrammarCache с помощью метода setEXISchema(grammarCache).
  6. Кодируйте XML-документ в EXI, вызывая метод encode (InputSource is).
  7. Используйте EXIDecoder в org.openexi.fujitsu.proc для декодирования EXI в события. После создания экземпляра EXIDecoder установите для него GrammarCache и InputStream. Вызов processHeader() возвращает сканер, а сканер позволяет перемещаться по EXI. Просто вызовите nextEvent() на Scanner, чтобы получить следующее событие, пока оно в конечном итоге не вернет значение null.

Если вы не используете схемы, вы можете использовать null при создании экземпляра GrammarCache выше.

Пожалуйста, дайте мне знать, если у вас есть проблемы.

таки

OpenEXI теперь предоставляет учебное пособие [1] по программированию с ним.

[1] http://openexi.sourceforge.net/tutorial/

Кроме того, в этом посте дискуссионного форума OpenEXI [2] показан код для преобразования из двоичного XML в (JaXB) Java-объект с помощью реализации SAX XMLReader "EXIReader":

[2] http://sourceforge.net/p/openexi/discussion/800031/thread/3103260f/?limit=50

В базе кода EXIfieious есть несколько модульных тестов, которые вы можете использовать в качестве примера.

Другие вопросы по тегам