1

我正在尝试编组一个对象并在此之后替换一些 invarvalid char。在此过程中,不会生成已完成的 xml。我只能在所有生成的文件中看到 1024 个字符。

package com.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.util.Scanner;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamResult;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.apache.log4j.Logger;
import org.xml.sax.SAXException;
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

public class MessageParserComponent {
    private static final Logger LOGGER = Logger.getLogger(MessageParserComponent.class);

           public File marshalIXml(final Object obj, final String xsdSchema,
        final String xmlFileName, final JAXBContext ctx) {
        File xml = new File(xmlFileName);

        try {
            xml.createNewFile();
            Marshaller marshaller = null;
            marshaller = ctx.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
                "http://www.db.com/tf " + xsdSchema);
            marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
                new NamespacePrefixMapper() {
                    @Override
                    public String getPreferredPrefix(String arg0, String arg1,
                        boolean arg2) {
                        return "tf";
                    }
                });

            marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
                "http://www.db.com/tf " + xsdSchema);
            marshaller.setSchema(getSchema(xsdSchema));
            marshaller.marshal(obj, new StreamResult(xml));
            xml = replaceInvalidChar('\u0007', '\n', xml);
            xml = replaceInvalidString("ns2", "xsi", xml);
        } catch (IOException e) {
            LOGGER.error(e);
        } catch (JAXBException e) {
            LOGGER.error(e);
        } catch (SAXException e) {
            LOGGER.error(e);
        }
        return xml;
    }

  private Schema getSchema(String xsdSchema) throws SAXException {
        SchemaFactory fact = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = fact.newSchema(this.getClass().getClassLoader()
                                           .getResource(xsdSchema));
        return schema;
    }

   private static File replaceInvalidString(String Target, String Dest,
        File Source) throws IOException {
        String xml_string;
        xml_string = new Scanner(Source).useDelimiter("\\Z").next();
        xml_string = xml_string.replace(Target, Dest);
        FileOutputStream fi = new FileOutputStream(Source);
        fi.write(xml_string.getBytes());
        return Source;
    }

    public static File replaceInvalidChar(char Target, char Dest, File Source)
        throws IOException {
        String xml_string;
        xml_string = new Scanner(Source).useDelimiter("\\Z").next();
        xml_string = xml_string.replace(Target, Dest);
        FileOutputStream fi = new FileOutputStream(Source);
        fi.write(xml_string.getBytes());
        return Source;
    }
}

字符串替换有限制吗?
我是否以错误的方式创建文件?

笔记:

我将文件存储在 UNIX 日志文件夹中
我有 java 6、JAXB 2.2

任何形式的帮助都将受到高度赞赏。

4

3 回答 3

0

当你打开一个FileOutputStream你负责关闭。您应该更改代码以包含close()调用。

    FileOutputStream fi = new FileOutputStream(Source);
    fi.write(xml_string.getBytes());
    fi.close();
于 2013-10-23T19:40:45.673 回答
0

只需检查您是否使用 jaxb 注释正确地注释了您的对象。为什么要设置 Marshaller 属性?你想使用外部模式来编组你的对象吗?相反,您为什么不让 jaxb 处理所有这些事情(如果您的对象在同一个工作区中可用)。

此示例程序可能对您有所帮助。 http://www.mkyong.com/java/jaxb-hello-world-example/

也检查一下这个..

JAXB Marshaller:StringWriter 输出具有截断的标记值 truncated-tag-value

于 2013-10-23T18:51:31.643 回答
0

问题出在扫描仪上,它试图找到 EOF 而不是假脱机整个文件。这在本地开发环境中不会发生。在 UNIX 服务器中,我的应用程序部署在哪里,“输入结束”是不同的,这导致了这个问题。

File f1 = new File(path);
     StringBuilder f2 = new StringBuilder();
        Scanner scanner = new Scanner(f1).useDelimiter("\\Z");

        while (scanner.hasNext()) {
           f2.append(scanner.next());

这完成了技巧。与其他 Buttered 阅读器相比,我不知道扫描仪的性能部分(仅占用 1024 个字符)。

任何其他提高性能的解决方案都非常受欢迎。

于 2013-10-23T19:58:54.857 回答