0

C# で Nagasena エンコーダーを実装しました。

 public byte[] encodeEXI(byte[] inBytes)
    {
        MemoryStream outStream = new MemoryStream();
        MemoryStream inStream = new MemoryStream(inBytes);
        try
        {
            Transmogrifier transmogrifier = new Transmogrifier();
            GrammarCache grammarCache = new GrammarCache((EXISchema)null, GrammarOptions.DEFAULT_OPTIONS);
            transmogrifier.setGrammarCache(grammarCache, (SchemaId)null);
            transmogrifier.OutputStream = outStream;
            transmogrifier.AlignmentType = AlignmentType.compress;
            transmogrifier.PreserveWhitespaces = false;
            transmogrifier.PreserveLexicalValues = false;
            transmogrifier.DeflateLevel = 1;
            transmogrifier.ResolveExternalGeneralEntities = false;


            Org.System.Xml.Sax.InputSource<Stream> iS = new Org.System.Xml.Sax.InputSource<Stream>(inStream);
            transmogrifier.encode(iS);

            outStream.Position = 0;
            last = outStream.ToArray();
            return outStream.ToArray();
        }
        catch (TransmogrifierException tex)
        {
            Console.WriteLine("Error in OpenExi_Library: " + tex);
            return null;
        }
        finally
        {
            outStream.Close();
            inStream.Close();
        }
    }

そして、単純で有効なxmlウィッチのエンコードに問題があります<>または&lt;&gt;:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<BPN>
  <Booo id="6001&lt;" />
  <PoooPoo id="2600" />
  <UserName>tomas</UserName>
  <VooId>MYID</VooId>
  <Text>&lt;</Text>
</BPN>

TransmogrifierException: Nagasena.Sax.TransmogrifierException: End of document is not expected で終わるだけです。

私は C# 実装を使用しているので、Java 実装で問題をテストしました。問題なく動作しています。そのため、いくつかのオプションを変更しようとしましたが、何も役に立ちませんでした。

と置き換え<Text>&lt;</Text><Text><![CDATA[<]]></Text>から<Booo id="6001&lt;" />削除すると&lt;- <Booo id="6001" />、エンコードは成功しました。ただし、属性では cdata を使用する可能性はなく、 <> が含まれている場合、または&lt;&gt;エラーになります。

ながせなライブラリのデバッグをするつもりですが、何か有益なアドバイスがあればよろしくお願いします。

どうも

4

1 に答える 1