编组JAXB对象会覆盖以前编组的文件

时间:2017-05-29 17:36:53

标签: java xml jaxb

所以这是一个我还没有解决的有趣的...我将从代码开始,然后是一些背景。

public void encodeElements(String path) throws Exception {
    LOGGER.warning("Marshalling config to " + path);
    JAXBContext ctx = JAXBContext.newInstance(RootElement.class);

    Marshaller marshaller = ctx.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    RootElement ele = new RootElement();
    ele.setDummyField("abc");

    QName qName = new QName("http://localhost/xml-schemas/mySchema", "rootelement");
    JAXBElement<RootElement> root = new JAXBElement<RootElement>(qName, RootElement.class, ele);

    marshaller.marshal(root, new FileOutputStream(path));
}

此应用的GUI上有一个“另存为”选项。每次调用此函数时,它都会覆盖使用“另存为”功能保存的上一个文件。例如:

  • 打开应用
  • 另存为 - “1.xml” - 这里一切都很好
  • 另存为 - “2.xml”

    调用JAXBContext.newInstance()会用1.xml的内容覆盖1.xml,并创建一个有效的2.xml。区分这两个文件显示它们实际上是相同的。重复此过程始终会覆盖上次保存的文件。 (IE另存为3.xml将覆盖2.xml并创建相同的3.xml,依此类推)。

    在调试器中逐步执行此操作已经向我显示JAXBContext ctx = JAXBContext.newInstance(RootElement.class);是覆盖前一个文件的行。

    我对从以前保存的文件中的信息被召回的位置感到茫然。我已经开始挖掘源头(here),这一点没有任何帮助。任何帮助或见解表示赞赏。

    PS - 该链接是正确的来源。我们使用JAXB 2.2.11在Java 1.6平台上。任何对平台的蔑视都可以不说明,因为我有同感。

1 个答案:

答案 0 :(得分:0)

原来问题在于: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/alchemyjs/0.4.2/styles/vendor.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/alchemyjs/0.4.2/scripts/vendor.js"></script> <script src="lodash.js"></script> </head> <body> <div class="alchemy" id="alchemy"></div> <script type="text/javascript"> alchemy.begin({ dataSource: "../result.json", dataType:'html', nodeCaption:'name', nodeMouseOver:'name', cluster: true, clusterColours:["#1B9E77,#D95F02,#7570B3,#E7298A,#66A61E,#E6AB02"] }) </script> </body> </html>

写入完成后,传入的流不会关闭。所以,我们必须自己关闭它:

marshaller.marshal(root, new FileOutputStream(path));

感谢那些看过的人。希望这有助于将来的某个人。