【问题标题】:java sample for encoding/decoding EXI? [closed]用于编码/解码 EXI 的 java 示例? [关闭]
【发布时间】:2016-03-29 21:31:14
【问题描述】:

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

有人可以帮忙吗?我似乎找不到示例应用。

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

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

【问题讨论】:

    标签: java xml exi exificient openexi


    【解决方案1】:

    使用Exificient,我设法使用来自"Help" pagetheir "demo" 的sn-p 将示例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 作为样本数据。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • ....这正是我要回答的问题。
      • 对,只是您没有明确询问他们可能实现哪些 API,这可能更容易回答(尽管项目网页似乎对这一重要信息保持沉默)。所以我想我会提到它以防万一。
      • 好的,很公平——我会编辑我的问题。
      【解决方案3】:

      EXIfiecient 代码库中有some unit tests 可以用作示例。

      【讨论】:

      • 酷,谢谢,这正是我要找的东西。
      • 那么,EXIficient 至少实现了 Stax (javax.xml.stream) 接口吧?
      • 链接为 404。EXIficient 已移至 github。
      【解决方案4】:

      使用 OpenEXI 的方法总结如下,步骤 2 和 3 是可选的。

      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。

      如果不使用schema,实例化时可以使用null 上面的 GrammarCache。

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

      【讨论】:

      • OpenEXI 是否实现了一些标准的 XML 处理 API?还是仅通过专有接口?
      • SAX API 即将推出。在编码方面,它已经支持 SAX。 Transmogrifier 的 getSAXTransmogrifier() 方法返回 SAX 处理程序。在解码方面,使基于 SAX 的解码器层性能的基础在本周刚刚到位,而基于 SAX 的解码 API 的最终工作将在一到两周内完成,具体取决于可用性劳动力。
      【解决方案5】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-21
        • 2022-01-10
        相关资源
        最近更新 更多