用于编码/解码EXI的java示例?

时间:2011-06-30 20:06:35

标签: java xml exi exificient openexi

我正在寻找一个用于编码/解码EXI (Efficient XML Interchange)流的Java示例程序,使用EXIficientOpenEXI

有人可以帮忙吗?我似乎无法找到示例应用程序。

编辑:或者,如果有人可以指向允许我使用EXIficient或OpenEXI的文档,那将会有所帮助。我找到了javadoc,但我不知道要使用哪些类。

或者,正如@StaxMan指出的那样,是否特别提及/讨论了与标准XML API之一一起使用的适当顶级类?

5 个答案:

答案 0 :(得分:4)

使用Exificient,我设法编码&使用"Help" pagetheir "demo"中的代码段将示例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 XSDSpring 4.1.6 POM from Maven central作为样本数据。

Nb:输出XML应该与输入等同,但不一定等于,因为注释和空格会丢失并且命名空间别名(?可能在这里使用错误的术语)是任意分配的。

答案 1 :(得分:2)

我不熟悉提到的两个图书馆;但我认为,作为任何理智的XML库,它们都会实现众所周知的Java XML处理API之一,例如SAX,Stax或DOM(可能带有一些扩展)。这是因为EXI只是标准XML Infoset的不同编码;因此,对于应用程序开发人员来说,事情看起来可能与普通的XML处理完全相同

那么,您可能只需要弄清楚他们实施的API并找到使用该API的教程吗?

答案 2 :(得分:0)

您可以使用EXIfiecient代码库中的some unit tests作为示例。

答案 3 :(得分:0)

在下面的步骤2和3中总结了使用OpenEXI的方法 是可选的。

  1. 在org.openexi.fujitsu.scomp包中使用EXISchemaFactory 将XML Schema转换为EXISchema。
  2. 将EXISchema序列化为文件。
  3. 从文件加载EXISchema。
  4. 在org.openexi.fujitsu.proc.grammars中实例化GrammarCache 通过为构造函数指定EXISchema来打包。
  5. 在org.openexi.fujitsu.sax包中实例化Transmogrifier, 并使用setEXISchema(grammarCache)方法设置GrammarCache。
  6. 通过调用encode(InputSource is)将XML文档编码到EXI中 方法
  7. 在org.openexi.fujitsu.proc中使用EXIDecoder将EXI解码为 事件。在实例化EXIDecoder之后,设置GrammarCache和 InputStream到它。调用processHeader()返回一个Scanner,和 扫描仪可让您浏览EXI。只需调用nextEvent() 在Scanner上获取下一个事件,直到它最终返回null。
  8. 如果不使用模式,则可以在实例化时使用null GrammarCache上面。

    如果您有任何问题,请告诉我。

    塔基

答案 4 :(得分:0)

OpenEXI现在提供有关如何使用它编程的教程[1]。

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

此外,这篇OpenEXI讨论论坛帖子[2]显示了使用“EXIReader”SAX XMLReader实现从二进制XML转换为(JaXB)Java对象的代码:

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