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ウィッチのエンコードに問題があります<>または<>
:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<BPN>
<Booo id="6001<" />
<PoooPoo id="2600" />
<UserName>tomas</UserName>
<VooId>MYID</VooId>
<Text><</Text>
</BPN>
TransmogrifierException: Nagasena.Sax.TransmogrifierException: End of document is not expected で終わるだけです。
私は C# 実装を使用しているので、Java 実装で問題をテストしました。問題なく動作しています。そのため、いくつかのオプションを変更しようとしましたが、何も役に立ちませんでした。
と置き換え<Text><</Text>
て<Text><![CDATA[<]]></Text>
から<Booo id="6001<" />
削除すると<
- <Booo id="6001" />
、エンコードは成功しました。ただし、属性では cdata を使用する可能性はなく、 <> が含まれている場合、または<>
エラーになります。
ながせなライブラリのデバッグをするつもりですが、何か有益なアドバイスがあればよろしくお願いします。
どうも