Как записать файл в XML с STAX? - PullRequest
1 голос
/ 18 марта 2012

У меня проблема с записью файла в xml. Вот как выглядит этот элемент в xsd.

<xs:element name="File">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:base64Binary">   
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

Вот мой способ написать:

       private void writeFile (XMLStreamWriter2 sw, final InputStream is){
//is - inputstream from file
            try {
                OutputStream output = null;
                InputStream input = new Base64InputStream(is, true);
                int count;

                    int BUFFER_SIZE = 4000;
                    byte[] buffer = new byte[BUFFER_SIZE];
                    output = new FileOutputStream(new File("D:\\test.txt"));
                    while ((count = input.read(buffer)) != -1) {

                            output.write(buffer, 0, count);
                            sw.writeBinary(buffer, 0, count);

                    }
                    is.close();
                    input.close();
                    output.close();
            } catch (XMLStreamException ex) {
                Logger.getLogger(StaxFinal.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(StaxFinal.class.getName()).log(Level.SEVERE, null, ex);
            } 
        }

Содержимое test.txt является допустимой строкой base-64, а содержимое файла File xml elements - нет (я проверяю с помощью http://www.opinionatedgeek.com/dotnet/tools/base64decode/)., почему

EDIT Пытаюсь использовать это, но я получаю много символов возврата каретки #xd;

private void writeFile (XMLStreamWriter sw, InputStream is){
   //is - FileInputStream
    Reader reader = new InputStreamReader(new Base64InputStream(is, true));
    char[] buf = new char[4096];
    int n;

        while( (n = reader.read(buf)) >= 0 ) {
                sw.writeCharacters(buf, 0, n-3 );
        }
}

EDIT Метод:

writeRaw(char[] chars, int i, int i1)

отлично работает. Странно, но Woodstox readElementAsBinary читает и декодирует base64 для меня. Почему writeBinary не записывает действительный base64? В любом случае, спасибо скаффман! Вы великолепны!

Ответы [ 2 ]

1 голос
/ 17 сентября 2012

Я предполагаю, что вы используете Base64InputStream из кодека Apache Commons. Он также предлагает конструктор с четырьмя аргументами, который можно использовать для полного отключения перевода строки. Приспосабливая свой метод к вопросу, вы можете написать правильный вывод Base64 следующим образом:

private void writeFile (XMLStreamWriter sw, InputStream is){
    //is - FileInputStream
    Reader reader = new InputStreamReader(new Base64InputStream(is, true, -1, null));
    char[] buf = new char[4096];
    int n;
    while( (n = reader.read(buf)) >= 0 ) {
        sw.writeCharacters(buf, 0, n);
    }
}
0 голосов
/ 18 марта 2012

На основе javadoc Base64InputStream: если вы предоставляете конструктору два параметра (InputStream in, boolean doEncode), тогда он создает Base64InputStream так, что все считанные данные либо кодируются Base64, либо декодируются Base64 из оригинала. при условии InputStream. и doEncode - true, если мы должны кодировать все данные, считанные с нас, false, если мы должны декодировать.

Поскольку я не уверен в том, что должна делать ваша функция, я могу только пересмотреть это:

  • либо вы можете включить doEncode в false (чтобы сохранить декодированный текст в вашем XML-файле)
  • или просто используйте входной поток напрямую (для копирования / вставки текстового файла в направлении xml)
...