从Java写入XML文档 – 简单

我知道在stackoverflow上从Java写到XML有很多问题,但它太复杂了。 我觉得我有一个非常简单的问题,我无法弄清楚。

所以我有一个程序需要大量的用户输入,我现在正在创建并附加带有结果的文本文档。 我将在这里发布我的编写器代码:

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(""); out.println(" "); }catch (IOException e) { System.err.println(e); }finally{ if(out != null){ out.close(); } } 

所以最后,我希望它写入一个已经存在的XML文件(我可以通过简单地改变我的编写器所在的位置来完成)。 问题是,这个XML文件有一个称为根标记。 我需要将我的程序的结果放在XML文件的底部,但是请先进行 。 这是唯一的要求。 我发现的一切看起来都太复杂了,我无法弄明白……

很感谢任何forms的帮助!

您应该使用一个不错的XML API。 例如,这是使用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); } } } 

真的不是那么难……而且它比手动写出来要强大得多。 (例如,如果您的事件标题包含“&”,这将做正确的事情 – 而您的代码将产生无效的XML。)

如果你喜欢流利的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); 

或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()); 

你可以使用JOOX 。 这是你如何做追加:

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

默认情况下,$(doc)将加载根节点。 如果需要内部节点,可以使用find()方法。 该库没有很好的文档记录,但是开源,您可以随时直接检查源。