可以使用DOM、JDOM和SAX方式向一个已经存在的XML文件中追加内容,SAX方式比较复杂。例如:原来的XML文件是:<?xml  version = "1.0" encoding = "utf-8"?>

冰与火之歌

乔治马丁

2014

89

安徒生童话

2004

77

English

我们要向第一个book节点的最后添加一个language节点:<?xml  version="1.0" encoding="UTF-8"?>

冰与火之歌

乔治马丁

2014

89

简体中文

安徒生童话

2004

77

English

基本思路是先解析到适当的位置再进行插入:

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 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方式是最简单的,推荐使用这种方式。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐