xml文件已经存在如何追加内容
如何向已经存在的xml文件中追加内容
如何向已经存在的xml文件中追加内容
2015-02-15
可以使用DOM、JDOM和SAX方式向一个已经存在的XML文件中追加内容,SAX方式比较复杂。例如:原来的XML文件是:
<?xml version = "1.0" encoding = "utf-8"?> <bookstore> <book id="1"> <name>冰与火之歌</name> <author>乔治马丁</author> <year>2014</year> <price>89</price> </book> <book id="2"> <name>安徒生童话</name> <year>2004</year> <price>77</price> <language>English</language> </book> </bookstore>
我们要向第一个book节点的最后添加一个language节点:
<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id="1"> <name>冰与火之歌</name> <author>乔治马丁</author> <year>2014</year> <price>89</price> <language>简体中文</language> </book> <book id="2"> <name>安徒生童话</name> <year>2004</year> <price>77</price> <language>English</language> </book> </bookstore>
基本思路是先解析到适当的位置再进行插入:
DOM方式:
private static void appendXMLByDOM() throws ParserConfigurationException, TransformerException, SAXException, IOException { // 1.创建一个DocumentBuilderFactory对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 2.根据DocumentBuilderFactory对象创建一个DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); // 3.使用DocumentBuilder对象的parse()方法返回一个Document对象(DOM树) Document document = db.parse("books1.xml"); document.setXmlStandalone(true);// 设置XML文件的声明standalone的值为yes并不予显示 // 4.追加节点 Node book = document.getElementsByTagName("book").item(0);// 得到第一个book节点 Element language = document.createElement("language"); language.setTextContent("简体中文"); book.appendChild(language); // 5.创建一个TransformerFactory对象 TransformerFactory tff = TransformerFactory.newInstance(); // 6.通过TransformerFactory对象创建一个Transformer对象 Transformer tf = tff.newTransformer(); // 7.利用Transformer对象的transform方法指定输出流 tf.setOutputProperty(OutputKeys.INDENT, "yes");// 设置缩进、换行 tf.transform(new DOMSource(document), new StreamResult(new File( "books_append_dom.xml"))); }
JDOM方式:
public static void appendXMLByJDOM() { // 1.创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); InputStream in; try { // 2.创建一个输入流,将xml文件加载到输入流 in = new FileInputStream("books1.xml"); // 3.通过SAXBuilder的build方法将输入流加载到SAXBuilder中 Document document = saxBuilder.build(in); // 4.通过Document对象获取xml文件的根节点 Element rootElement = document.getRootElement(); // 5.根据根节点获取子节点的List集合 List<Element> bookList = rootElement.getChildren(); // 6.追加节点 Element language = new Element("language"); language.setText("简体中文"); bookList.get(0).addContent(language); // 7.设置输出流和输出格式 Format format = Format.getCompactFormat(); format.setEncoding("gb2312");//设置编码方式为gb2312 format.setIndent(" ");//设置缩进(此处为一个tab键) XMLOutputter outputter = new XMLOutputter(format); outputter.output(document, new FileOutputStream("books_append_jdom.xml")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
DOM4J方式:
public static void appendXMLByDOM4J() throws IOException { // 1.创建一个SAXReader对象reader SAXReader reader = new SAXReader(); try { // 2.通过reader对象的read方法加载xml文件,获取Document对象 Document document = reader.read(new File("books1.xml")); Element bookStore = document.getRootElement();// 通过document对象获取根节点bookstore Element book = bookStore.element("book"); Element language = book.addElement("language"); language.setText("简体中文"); // 3.设置输出格式和输出流 OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(new FileOutputStream( "books_append_dom4j.xml"), format); writer.write(document);// 将文档写入到输出流 writer.close(); } catch (DocumentException e) { e.printStackTrace(); } }
其中DOM4J方式是最简单的,推荐使用这种方式。
举报