java - 如何使用 STAX 将文件写入 xml?

标签 java xml io stax

我在将文件写入 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 元素文件的内容不是(我正在检查 http://www.opinionatedgeek.com/dotnet/tools/base64decode/ )。为什么

编辑 尝试使用这个,但我得到了很多回车符#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 );
        }
}

编辑 方法:

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

工作正常。奇怪的是,woodstox 的 readElementAsBinary 可以为我读取和解码 base64。为什么writeBinary不写入有效的base64? 不管怎样,谢谢斯卡夫曼!你太棒了!

最佳答案

我假设您使用 Apache Commons Codec 中的 Base64InputStream。它还提供了一个带有四个参数的构造函数,可用于完全关闭换行符。 根据问题调整您的方法,您可以编写有效的 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);
    }
}

关于java - 如何使用 STAX 将文件写入 xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9758737/

相关文章:

c# - 如何从 XML 中获取此值?

java - 如何清除 Java 中的扫描仪缓冲区?

JavaFX : Need help understanding project hierarchy issues

java - Maven 管理的依赖项与声明的具有不同名称的依赖项之间的冲突

xml - 将缺少元素的 XML 解析并转换为表结构

Android Intent 信息传递

linux - 在没有 O_SYNC 的情况下使用 O_DIRECT 是否安全?

Java访问控制异常: Access Denied when writing

java - 如果使用 SwingWorker 加载数据,何时将 TabelModel 绑定(bind)到 JTable?

java - Android 编辑文本 mask