我正在寻找一个用于编码/解码EXI (Efficient XML Interchange)流的Java示例程序,使用EXIficient或OpenEXI。
有人可以帮忙吗?我似乎无法找到示例应用程序。
编辑:或者,如果有人可以指向允许我使用EXIficient或OpenEXI的文档,那将会有所帮助。我找到了javadoc,但我不知道要使用哪些类。
或者,正如@StaxMan指出的那样,是否特别提及/讨论了与标准XML API之一一起使用的适当顶级类?
答案 0 :(得分:4)
使用Exificient,我设法编码&使用"Help" page和their "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 XSD和Spring 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的方法 是可选的。
如果不使用模式,则可以在实例化时使用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