Я реализовал Нагасеной кодер в C#:Нагасена/OpenExi: кодирование XML с < в атрибуте
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: Конец документа не ожидается.
Я использую реализацию C#, поэтому я протестировал проблему в реализации Java - там она работает хорошо. Итак, я попытался изменить некоторые параметры, но ничего не помогло.
Когда я заменить <Text><</Text>
с <Text><![CDATA[<]]></Text>
и от <Booo id="6001<" />
я удален <
- <Booo id="6001" />
, кодирование было успешным. Но в атрибуте нет возможности использовать cdata, и когда он содержит <> или <>
, он заканчивается ошибкой.
Я собираюсь отлаживать библиотеку нагасена, но если у кого-то есть полезные советы, я буду благодарен.
ТНХ
после отладки некоторых код нагасы ... я получил внутреннее SaxException: {"ссылка на внешний объявленный объект \" lt \ ", когда документ объявлен автономным"}, поэтому я изменил свойство автономно на no, и он работает, но я не понимаю, почему ... –