简体   繁体   English

从Java写入XML文档 - 简单

[英]Writing from Java to an XML document - Simple

I know there's tons of questions on writing from Java to XML on stackoverflow, but it's all too complex. 我知道在stackoverflow上从Java写到XML有很多问题,但它太复杂了。 I feel I have a very simple problem that I just can't figure out. 我觉得我有一个非常简单的问题,我无法弄明白。

So I have a program that takes a bunch of user input and I have it currently creating and appending a text document with the results. 所以我有一个程序需要大量的用户输入,我现在正在创建并附加带有结果的文本文档。 I'll just post my writer code here: 我将在这里发布我的编写器代码:

 PrintWriter out = null;
         try {
             out = new PrintWriter(new BufferedWriter(new FileWriter("C:/Documents and Settings/blank/My Documents/test/test.txt", true)));
             out.println("");
             out.println("<event title=\""+titleFieldUI+"\"");
             out.println("  start=\""+monthLongUI+" "+dayLongUI+" "+yearLongUI+" 00:00:00 EST"+"\"");            
             out.println("  isDuration=\"true\"");
             out.println("  color=\""+sValue+"\"");
             out.println("  end=\""+monthLong1UI+" "+dayLong1UI+" "+yearLong1UI+" 00:00:00 EST"+"\"");
             out.println("  "+descriptionUI);
             out.println("");
             out.println("</event>");
             out.println("  <!-- Above event added by: " +System.getProperty("user.name")+" " +
                        "on: "+month+"/"+day+"/"+year+" -->");       
         }catch (IOException e) {
             System.err.println(e);
         }finally{
             if(out != null){
                 out.close();
             }
         } 

So in the end, I want it to write to an already existing XML file (which I can do by simply changing where my writer goes to). 所以最后,我希望它写入一个已经存在的XML文件(我可以通过简单地改变我的编写器所在的位置来完成)。 Problem is, this XML file has ONE root tag known as <data> . 问题是,这个XML文件有一个称为<data>根标记。 I need the results of my program to go on the bottom of the XML file, but come BEFORE </data> . 我需要将我的程序的结果放在XML文件的底部,但是请先进行</data> That's the only requirement. 这是唯一的要求。 Everything I find seems too complex and I can't figure it out.. 我发现的一切看起来都太复杂了,我无法弄明白......

Any help is very much appreciated! 很感谢任何形式的帮助!

You should use a decent XML API. 您应该使用一个不错的XML API。 For example, here's an example using JDOM : 例如,这是使用JDOM的示例:

import java.io.*;

import org.jdom2.*;
import org.jdom2.input.*;
import org.jdom2.output.*;

public class Test {
    public static void main(String args[]) throws IOException, JDOMException {
        File input = new File("input.xml"); 
        Document document = new SAXBuilder().build(input);
        Element element = new Element("event");
        element.setAttribute("title", "foo");
        // etc...
        document.getRootElement().addContent(element);

        // Java 7 try-with-resources statement; use a try/finally
        // block to close the output stream if you're not using Java 7
        try(OutputStream out = new FileOutputStream("output.xml")) {
            new XMLOutputter().output(document, out);
        }
    }
}

It's really not that hard... and it'll be much, much more robust than writing it out manually. 真的不是那么难......而且它比手动写出来要强大得多。 (For example, this will do the right thing if your event title contains "&" - whereas your code would have produced invalid XML.) (例如,如果您的事件标题包含“&”,这将做正确的事情 - 而您的代码会产生无效的XML。)

If you like fluent api , then you can use JOOX : 如果你喜欢流畅的api ,那么你可以使用JOOX

File file = new File("projects.xml");

Document document = $(file).document();

Comment eventComment = document.createComment("Above event added by: "
        + System.getProperty("user.name") + "\n" +
        " on: " + month + "/" + day + "/" + year);

document = $(file)
        .xpath("//data")
        .append($("event",
                $("title", "titleFieldUI"),
                $("start", monthLongUI + " " + dayLongUI + " " + yearLongUI + " 00:00:00 EST"),
                $("isDuration", "true"),
                $("color", sValue),
                $("end", monthLong1UI + " " + dayLong1UI + " " + yearLong1UI + " 00:00:00 EST")))
        .append($(eventComment))
        .document();

Transformer transformer = TransformerFactory.newInstance().newTransformer();
Result output = new StreamResult(file);
Source input = new DOMSource(document);

transformer.transform(input, output);

or XMLBuilder XMLBuilder

XMLBuilder builder = XMLBuilder.parse(
        new InputSource(new FileReader("C:/Documents and Settings/blank/My Documents/test/test.txt")))
        .xpathFind("//data")
        .e("event")
        .a("title", titleFieldUI)
        .a("start", monthLongUI + " " + dayLongUI + " " + yearLongUI + " 00:00:00 EST")
        .a("isDuration", "true")
        .a("color", sValue)
        .a("end", monthLong1UI + " " + dayLong1UI + " " + yearLong1UI + " 00:00:00 EST")
        .up()
        .comment("Above event added by: " + System.getProperty("user.name") + "\n" +
                " on: " + month + "/" + day + "/" + year);

PrintWriter writer = new PrintWriter(new FileOutputStream("C:/Documents and Settings/blank/My Documents/test/test.txt"));
builder.toWriter(writer, new Properties());

You could use JOOX . 你可以使用JOOX This is how you would do an append: 这是你如何做一个追加:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
Document doc = parser.parse("/pathToXML");

JOOX.$(doc).append("<newNode>data<newNode>");

By default the $(doc) will load the root node. 默认情况下,$(doc)将加载根节点。 If you want an inner node you can use the find() method. 如果需要内部节点,可以使用find()方法。 The library is not documented very well but being open source you can always directly check the sources. 图书馆没有很好的文档记录,但作为开源,您可以随时直接检查源。

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

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