Пример 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 являются необязательными.
- Используйте EXISchemaFactory в пакете org.openexi.fujitsu.scomp для преобразования XML-схем в EXISchema.
- Сериализация EXISchema в файл.
- Загрузите EXISchema из файла.
- Создайте GrammarCache в пакете org.openexi.fujitsu.proc.grammars, указав EXISchema для конструктора.
- Создайте экземпляр Transmogrifier в пакете org.openexi.fujitsu.sax и установите GrammarCache с помощью метода setEXISchema(grammarCache).
- Кодируйте XML-документ в EXI, вызывая метод encode (InputSource is).
- Используйте 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 есть несколько модульных тестов, которые вы можете использовать в качестве примера.