5

EXIficientまたはOpenEXIを使用して、 EXI (Efficient XML Interchange)ストリームをエンコード/デコードするための Java サンプル プログラムを探しています。

誰か助けてくれませんか?サンプルアプリが見つからないようです。

編集: または、EXIficient または OpenEXI を使用できるようにするドキュメントを誰かが教えてくれれば、それは役に立ちます。javadoc を見つけましたが、どのクラスを使用すればよいかわかりません。

または、@StaxMan が指摘しているように、標準 XML API の 1 つと一緒に使用する適切なトップレベル クラスの特定の言及/議論はありますか?

4

5 に答える 5

4

Exificientを使用して、 「ヘルプ」ページ「デモ」のスニペットを使用して、サンプル XML を EXI としてエンコードおよびデコードすることができました。

<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 XSDMaven central の Spring 4.1.6 POMをサンプル データとして使用します。

注:出力 XML は入力と同等である必要がありますが、コメントと空白が失われ、名前空間エイリアス (? はここで間違った用語を使用している可能性があります) が任意に割り当てられているため、必ずしも等しいとは限りません。

于 2015-07-08T01:21:08.367 に答える
2

私は言及された 2 つのライブラリに精通していません。しかし、私は、まともな XML ライブラリとして、SAX、Stax、DOM (おそらくいくつかの拡張機能付き) などのよく知られた Java XML 処理 API の 1 つを実装していると思います。これは、EXI が標準の XML Infoset のエンコーディングとは異なるためです。そのため、アプリケーション開発者にとっては、通常の XML 処理とまったく同じように見えるかもしれません。

では、彼らが実装している API を把握し、その API を使用するためのチュートリアルを見つけるだけでよいのでしょうか?

于 2011-06-30T23:30:43.810 に答える
0

EXIfiecientコードベースには、例として使用できるいくつかの単体テストがあります。

于 2011-06-30T21:49:24.040 に答える
0

OpenEXI では、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

于 2012-03-06T06:55:27.603 に答える
0

OpenEXI の使用方法を以下に要約します。ステップ 2 と 3 はオプションです。

  1. org.openexi.fujitsu.scomp パッケージの EXISchemaFactory を使用して、XML スキーマを EXISchema に変換します。
  2. EXISchema をファイルにシリアライズします。
  3. ファイルから EXISchema を読み込みます。
  4. コンストラクターに EXISchema を指定して、org.openexi.fujitsu.proc.grammars パッケージの GrammarCache をインスタンス化します。
  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 が返され、Scanner を使用すると EXI をナビゲートできます。Scanner で nextEvent() を呼び出すだけで、最終的に null が返されるまで次のイベントを取得できます。

スキーマを使用しない場合は、上記の GrammarCache をインスタンス化するときに null を使用できます。

お困りのことがありましたらお知らせください。

タキ

于 2011-07-01T16:56:22.927 に答える