2013-01-17 1 views
1

Приведенный ниже код представляет собой попытку упростить установку, необходимую для сжатия ExI и декомпрессию с использованием EXIficientпроблемы кодирования при извлечении EXI сжатого XML

class ExiCompressionUtils { 
    static Transformer transformer = TransformerFactory.newInstance().newTransformer() 

    static byte[] compress(String xml) { 
     ByteArrayOutputStream exiOS = new ByteArrayOutputStream() 
     EXIResult exiResult = new EXIResult(outputStream : exiOS) 

     XMLReader xmlReader = XMLReaderFactory.createXMLReader() 
     xmlReader.contentHandler = exiResult.handler 
     xmlReader.parse(new InputSource(new StringReader(xml))) 

     def compressed = exiOS.toByteArray() 
     exiOS.close() 
     return compressed 
    } 

    static String extract(byte[] compressed) { 
     SAXSource exiSource = new SAXSource(new InputSource(new ByteArrayInputStream(compressed))) 
     exiSource.setXMLReader(exiSource.reader) 

     ByteArrayOutputStream exiOS = new ByteArrayOutputStream() 
     transformer.transform(exiSource, new StreamResult(exiOS)) // fails here 
     def extracted = exiOS.toString() 
     exiOS.close() 
     return compressed 
    } 
} 

Ниже тест не пройден с ERROR: 'Invalid byte 1 of 1-byte UTF-8 sequence.'

@Test 
void testExiCompression() { 
    def xml = '<Root><Child id="1">Text</Child><EmptyTag/></Root>' 
    def compressed = ExiCompressionUtils.compress(xml) 
    assert ExiCompressionUtils.extract(compressed) == xml 
} 

Какие-нибудь эксперты в области кодирования, которые могут понять это?

+0

Я не могу понять: это реальный Java? Почему точки с запятой опущены? Что такое конструкция 'def compress ...'? – Andremoniy

+0

Это Groovy ... достаточно близко, компилируется в .class файлы, в основном эквивалентные здесь. Я назвал его Java, потому что он мог бы просто быть простой Java, а не пару ярлыков, которые я взял с Groovy. В любом случае, они являются взаимозаменяемыми для большинства целей в эти дни. – jkschneider

+0

@jkschneider Просто мысль, но есть файл тестового файла (который имеет XML), закодированный в * UTF-8 *? Я не очень разбираюсь в exi, но я видел эту ошибку раньше, и обычно это связано с кодировкой xml, не соответствующей * UTF-8 *. – BPaasch

ответ

1

Сегодня я пробовал этот комментарий. Существует одна важная проблема с этим кодом (помимо странного синтаксиса для Java, отсутствующих точек с запятой и т. Д.)

При чтении используйте EXISource, а не SAXSource!

Прилагается фрагмент кода, который работает.

- Daniel

static Transformer transformer; 

static { 
    try { 
     transformer = TransformerFactory.newInstance().newTransformer(); 
    } catch (TransformerConfigurationException e) { 
    } catch (TransformerFactoryConfigurationError e) { 
    } 
} 

static byte[] compress(String xml) throws IOException, EXIException, 
     SAXException { 
    ByteArrayOutputStream exiOS = new ByteArrayOutputStream(); 
    EXIResult exiResult = new EXIResult(); 
    exiResult.setOutputStream(exiOS); 

    XMLReader xmlReader = XMLReaderFactory.createXMLReader(); 
    xmlReader.setContentHandler(exiResult.getHandler()); 
    xmlReader.parse(new InputSource(new StringReader(xml))); 

    byte[] compressed = exiOS.toByteArray(); 
    exiOS.close(); 

    return compressed; 
} 

static String extract(byte[] compressed) throws TransformerException, 
     IOException, EXIException { 
    // SAXSource exiSource = new SAXSource(new InputSource(new 
    // ByteArrayInputStream(compressed))); // use EXISource instead! 
    SAXSource exiSource = new EXISource(); 
    exiSource.setInputSource(new InputSource(new ByteArrayInputStream(
      compressed))); 

    ByteArrayOutputStream exiOS = new ByteArrayOutputStream(); 
    transformer.transform(exiSource, new StreamResult(exiOS)); 
    String extracted = exiOS.toString(); 
    exiOS.close(); 
    return extracted; 
} 

public static void main(String[] args) throws IOException, EXIException, 
     SAXException, TransformerException { 
    String xml = "<Root><Child id=\"1\">Text</Child><EmptyTag/></Root>"; 
    byte[] compressed = ExiCompressionUtils.compress(xml); 
    System.out.println(ExiCompressionUtils.extract(compressed)); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^