下面是一个简单的xml文件,另外项目简单的架构也展示了出来
package com.test;
import java.io.File;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class TsetDom {
public static void main(String[] args) {
System.out.println("dom操作xml文件");
//修改
modify("b1","");
//删除
delete("骆驼祥子");
//新增book节点
add();
//查询
show();
}
private static void delete(String string) {
}
private static void modify(String string, String string2) {
}
//添加
private static void add() {
DocumentBuilderFactory fac= DocumentBuilderFactory.newInstance();
try {
DocumentBuilder dbd = fac.newDocumentBuilder();
Document doc = dbd.parse(new File("books.xml"));
//创建book title author节点
Element book = doc.createElement("book");
Element title = doc.createElement("title");
Element author = doc.createElement("author");
book.setAttribute("id", "b8");
title.setTextContent("西游记");
author.setTextContent("吴承恩");
//节点关系说明
book.appendChild(title);
book.appendChild(author);
Node books = doc.getElementsByTagName("books").item(0);
books.appendChild(book);
//从dom对象更新到xml
TransformerFactory tranFac = TransformerFactory.newInstance();
Transformer trans = tranFac.newTransformer();
DOMSource domSource = new DOMSource(doc);
//字符集设置
trans.setOutputProperty(OutputKeys.ENCODING, "utf-8");
//使用W3CDom编辑完上面的XML文件,把document转换为XML文件的时候,DTD定义会丢失,加入下面两行代码报空异常,所以我就改变的实现的方式
//trans.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "doc.getDoctype().getPublicId()");
//trans.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,doc.getDoctype().getSystemId());
//解决办法:加入下面的一行代码,调用后正常引用DTD文件
trans.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "dtd1.dtd");
StreamResult streamResult = new StreamResult(new FileOutputStream("books.xml"));
trans.transform(domSource, streamResult);
System.out.println("add操作完成");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void show(){
//1.创建解析器工厂
//2.创建解析器
//3.获得dom对象
try {
DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
DocumentBuilder dbd = fac.newDocumentBuilder();
Document doc = dbd.parse(new File("books.xml"));
NodeList books = doc.getElementsByTagName("book");
// System.out.println(books.getLength());
for (int i = 0; i < books.getLength(); i++) {
Node book = books.item(i);
NodeList fields = book.getChildNodes();
// System.out.println(fields.getLength());
for (int j = 0; j < fields.getLength(); j++) {
Node field = fields.item(j);
//判断node是否是标题或者作者
if("title".equals(field.getNodeName()) || "author".equals(field.getNodeName())) {
//标题或作者
System.out.print(field.getTextContent()+" ");
}
}
System.out.println("");
}
System.out.println("操作完成");
} catch (Exception e) {
e.printStackTrace();
}
}
}
dtd1.dtd中内容如下
<!ELEMENT books (book+)>
<!ELEMENT book (title,author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ATTLIST book id ID #REQUIRED>