编码/解码EXI的java示例?

编码/解码EXI的java示例?,java,xml,exi,exificient,openexi,Java,Xml,Exi,Exificient,Openexi,我正在寻找一个Java示例程序,用于使用或对流进行编码/解码 有人能帮忙吗?我似乎找不到示例应用程序 编辑:或者,如果有人能向我指出允许我使用EXIficient或OpenEXI的文档,那将是很有帮助的。我找到了javadoc,但我不知道该使用哪些类 或者,正如@StaxMan所指出的,是否特别提到/讨论了与标准XML API之一一起使用的适当顶级类?现有的代码库中有一些可用作示例。我不熟悉提到的两个库;但我假设,作为任何一个健全的XML库,它们实现了一个众所周知的Java XML处理API,如

我正在寻找一个Java示例程序,用于使用或对流进行编码/解码

有人能帮忙吗?我似乎找不到示例应用程序

编辑:或者,如果有人能向我指出允许我使用EXIficient或OpenEXI的文档,那将是很有帮助的。我找到了javadoc,但我不知道该使用哪些类


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

现有的代码库中有一些可用作示例。

我不熟悉提到的两个库;但我假设,作为任何一个健全的XML库,它们实现了一个众所周知的Java XML处理API,如SAX、Stax或DOM(可能有一些扩展)。这是因为EXI只是标准XMLInfoset的不同编码;因此,对于应用程序开发人员来说,事情可能与正常的XML处理完全相同


因此,您可能只需要了解他们实现的API,并找到使用该API的教程?

下面总结了使用OpenEXI的方法,其中包括步骤2和步骤3 是可选的

  • 在org.openexi.fujitsu.scomp包中使用EXISchemaFactory 将XML模式转换为EXISchema
  • 将EXISchema序列化为文件
  • 从文件加载EXISchema
  • 在org.openexi.fujitsu.proc.grammars中实例化GrammarCache 通过向构造函数指定EXISchema来打包
  • 在org.openexi.fujitsu.sax包中实例化Transmogrifier, 并使用setEXISchema(GrammarCache)方法设置GrammarCache
  • 通过调用Encode(InputSource is)将XML文档编码到EXI中 方法
  • 使用org.openexi.fujitsu.proc中的EXIDecoder将EXI解码为 事件。实例化EXIDecoder后,设置GrammarCache和 输入流到它。调用processHeader()返回扫描程序,然后 扫描仪允许您在EXI中导航。只需调用nextEvent() 在扫描程序上获取下一个事件,直到它最终返回null
  • 如果不使用模式,则可以在实例化时使用null 上面是格拉玛卡奇

    如果你有什么困难,请告诉我


    taki

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

    [1]

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

    [2]

    使用,我成功地使用他们的代码片段将示例XML编码和解码为EXI,并且,我仅使用Maven依赖项就成功地完成了以下工作

    <dependency>
        <groupId>com.siemens.ct.exi</groupId>
        <artifactId>exificient</artifactId>
        <version>0.9.4</version>
    </dependency>
    
    使用和作为示例数据


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

    很酷,谢谢,这就是我一直在寻找的东西。因此,EXIficient至少实现了Stax(javax.xml.stream)接口,对吗?链接是404。EXIficient已经转移到github…这正是我试图回答的问题。对,只是你没有明确询问他们可能实现哪些API,哪些API更容易回答(尽管project web页对这一重要信息似乎出人意料地沉默)。所以我想我会提到它以防万一。好吧,很公平——我会编辑我的问题。OpenEXI实现了一些标准的XML处理API吗?还是只是通过专有接口实现的?SAX API很快就会出现。在编码方面,它已经支持SAX。Transmogrifier的GetSAXSTransmogrifier()方法返回SAX处理程序。在解码端,一个使SAX为基础的解码器层性能的基础本周刚刚就位,而基于SAX的DooAPI API的最终工作仅需一周或一周的时间,这取决于劳动力的可用性。
    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));
        }
    
    }