繁体   English   中英

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

[英]How to write a file to xml with 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 elements文件的内容则不是(我正在使用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)

工作正常。 奇怪,但是伍德斯托克斯的readElementAsBinary为我读取和解码了base64。 为什么writeBinary不写有效的base64? 无论如何,谢谢skaffman! 你真棒!

我假设您使用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);
    }
}

基于Base64InputStream的javadoc:如果您向构造函数提供两个参数(InputStream in,boolean doEncode),则它将创建一个Base64InputStream,以便从原始提供的InputStream中读取的所有数据都经过Base64编码或Base64解码。 doEncode-如果我们应该对从我们读取的所有数据进行编码,则为true;如果我们应该解码,则为false。

因为我不确定您的函数应该做什么,所以我只能对此进行检查:

  • 您可以将doEncode设置为false(将解码后的文本存储在xml文件中)
  • 或者干脆使用InputStream 直接(复制/粘贴对XML文本文件)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM