-1

我从客户那里收到一个XML文件。我有另一个文件,其中包含Base-64我嵌入在 XML 文件中的一个元素中的编码数据。完成所有这些合并后,我需要将文件的内容作为对象stringDOM对象返回,返回 asInputStream将不起作用。

但是生成的合并文件null character最后会在文件被处理为XML. 我怎样才能摆脱它。这就是我合并文件的方式。

public Object merge(List<File> files) throws Exception {
    System.out.println("merge with arguments is called");

    if(files == null || files.isEmpty() || files.size()<2){
        throw new IllegalArgumentException("File list cannot be null/empty and minimum 2 files are expected");
    }

    File imageFile = getImageFile(files);
    File indexFile = getIndexFile(files);

    File inProcessFile = new File("temp/" + indexFile.getName().replaceFirst("[.][^.]+$", "") + ".xml");
    File base64EncodedFile = toBase64(imageFile);

    /* Write from index file everything till attachment data to inProcess file*/
    Scanner scanner = new Scanner(indexFile).useDelimiter("\\s*<AttachmentData>\\s*");      
    FileWriter writer = new FileWriter(inProcessFile);
    writer.append(scanner.next());

    /* Write <AttachmentData> element into inProcess file */
    writer.append("<AttachmentData>");

    /* Write base64 encoded image data into inProcess file */
    IOUtils.copy(new FileInputStream(base64EncodedFile), writer);

    /* Write all data from </AttachmentData> element from index file into inProcess file */
    String fileAsString = IOUtils.toString(new BufferedInputStream(new FileInputStream(indexFile)));
    String afterAttachmentData = fileAsString.substring(fileAsString.indexOf("</AttachmentData>"));

    InputStream input = IOUtils.toInputStream(afterAttachmentData);
    IOUtils.copy(input, writer);

    /* Flush the file, processing completed */
    writer.flush();
    writer.close();
    System.out.println("Process completed");
}


private File getIndexFile(List<File> files) {
        for(File file:files){
            String extension = FilenameUtils.getExtension(file.getName());
            if(extension.equalsIgnoreCase(IDX_FILE_EXT))
                return file;
        }

        throw new IllegalArgumentException("Index file doesn't exist or cannot be read.");

    }


    private File getImageFile(List<File> files) {
        for(File file:files){
            String extension = FilenameUtils.getExtension(file.getName());
            if(extension.equalsIgnoreCase(IMG_FILE_EXT))
                return file;
        }

        throw new IllegalArgumentException("Image file doesn't exist or cannot be read.");

    }


    private File toBase64(File imageFile) throws Exception {
        System.out.println("toBase64 is called");
        Base64InputStream in = new Base64InputStream(new FileInputStream(imageFile), true);
        File f = new File("/temp/" + imageFile.getName().replaceFirst("[.][^.]+$", "") + ".txt");
        Writer out = new FileWriter(f);
        IOUtils.copy(in, out);
        return f;
    }

请帮助我了解如何修复产生空字符的代码

4

1 回答 1

3

修复产生它的代码,可能通过删除部分或全部。要找出这一点,您应该问自己以下问题:

  1. 从客户端接收到的原始 XML 文件中是否已经存在空字符?
  2. 包含 base-64 数据的元素出现在 XML 文档的哪个位置?
  3. 空字符出现在 XML 文档的什么位置?
  4. 您是否以任何形式解码 base-64 文件?
  5. base-64 文件是否包含空字符?
  6. 如果是,为什么?
  7. 使用什么方法将 base-64 编码的数据“合并”到 XML 文档中?

根据 OP 稍后生成的信息,如果文件始终包含空字符,最简单的解决方案是替换行:

String afterAttachmentData = fileAsString.substring(fileAsString.indexOf("</AttachmentData>"));

String afterAttachmentData = fileAsString.substring(fileAsString.indexOf("</AttachmentData>"),fileAsString.length()-1);

但是,从长远来看,最好与客户端检查是否在其结束时生成了空字符,如果是,建议他们更正生成它的代码,以使 XML 文档有效。

于 2013-08-27T16:06:44.523 回答