JAVA项目文件 package dom_jiexi; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.junit.Test; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class XmlCrudDemo { @Test public void test() throws ParserConfigurationException, SAXException, IOException, TransformerException { // 调用DocumentBuilderFactory中的newInstance(),创建新的DocumentBuilderFactory实例对象 DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); // 调用DocumentBuilderFactory中的newDocumentBuilder();创建一个新的Documentbuilder实例对象 DocumentBuilder builder = builderFactory.newDocumentBuilder(); // 调用DocumentBuilder中的parse(File f);方法创建指定文件的Document对象 Document document = builder.parse(this.getClass().getClassLoader() .getResourceAsStream("dom_jiexi//java.xml")); String tagname = "王亮"; // insert(document); // findByElementName(document); // findByName(document, "Boss姚"); // findById(document, "x121"); // deleteNodeById(document, "x121"); // updateNodeById(document, "x121"); insert(document, "x121"); } // 向xml文件中指定的节点后添加节点 public void insert(Document document, String id) throws TransformerException { // 获取要操作的元素节点对象 Element elm = document.getElementById(id); // 获取该节点的父节点 Node nodeparent = elm.getParentNode(); // 通过传入的document对象创建一个指定的元素节点对象 Element nd = document.createElement("student"); // 设置属性并赋值 nd.setAttribute("id", "x13333"); // 创建元素节点对象 Node name = document.createElement("name"); Node age = document.createElement("age"); Node sex = document.createElement("sex"); // 为创建的元素节点对象的文本节点赋值 name.setTextContent("donghongyujava"); age.setTextContent("20"); sex.setTextContent("男"); // 将创建的子节点子节点的对象添加到子节点下 nd.appendChild(name); nd.appendChild(age); nd.appendChild(sex); // 将子节点添加到父节点 nodeparent.appendChild(nd); // 创建TransformerFactory对象 TransformerFactory transformerFactory = TransformerFactory .newInstance(); // Transformer类用来将代表xml文件的Document对象装换位某种格式后进行输出 // Transformer对象通过TransformerFactory获得 Transformer transformer = transformerFactory.newTransformer(); // 将处理后的Document对象重新写入 到另一个xml文件 transformer.transform(new DOMSource(document), new StreamResult( new File("src//c.xml"))); } // 根据标签名称来查找所有改名称的节点对象 public void findByElementName(Document document) { // 获取指定的标记名称的所有元素的节点集合 NodeList nodelist = document.getElementsByTagName("teacher"); System.out.println(nodelist.getLength()); for (int i = 0; i < nodelist.getLength(); i++) { // 遍历得到集合中的每一个元素 Node node = nodelist.item(i); System.out.println(node.getNodeName()); } } // 根据属性的值查找节点对象 public Node findByName(Document document, String tagname) { // 获取指定的标记名称的所有元素的节点集合 NodeList nodelist = document.getElementsByTagName("teacher"); for (int i = 0; i < nodelist.getLength(); i++) { // 遍历得到集合中的每一个元素 Element node = (Element) nodelist.item(i); // 获取指定的元素中的指定的属性 Attr attr = node.getAttributeNode("name"); // 判断属性的值 if (attr.getValue().equals(tagname)) { System.out.println(attr); // 返回符合条件的元素 return node; } } return null; } // 根据ID产找节点对象 public Node findById(Document document, String id) { Node node = document.getElementById(id); System.out.println(node); return node; } // 删除获取到的节点 public void deleteNodeById(Document document, String id) throws TransformerException { // 获取要删除的节点对象 Node node = document.getElementById(id); // 得到父节点后在删除子节点 Node nod = node.getParentNode().removeChild(node); // 创建TransformerFactory对象 TransformerFactory transformerFector = TransformerFactory.newInstance(); // Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出 // Transformer对象通过TransformerFactory获得 Transformer transformer = transformerFector.newTransformer(); // 调用transform();将Document对象重新写入一个XML文件中 transformer.transform(new DOMSource(document), new StreamResult( new File("src//a.xml"))); } // 更新指定数据 public void updateNodeById(Document document, String id) throws TransformerException { // 根据id获取指定元素的节点对象 Element node = document.getElementById(id); // 获取元素节点的id属性节点对象 Attr attr = node.getAttributeNode("id"); // 修改元素节点的属性值 attr.setValue("x122"); // 获取该节点的对象的所有孩子节点对象name,age,sex节点 NodeList nodelist = node.getChildNodes(); // 遍历集合 for (int i = 0; i < nodelist.getLength(); i++) { // 得到每一个子节点的实体 Node no = nodelist.item(i); // 判断是否是元素节点对象 if (no.getNodeType() == Node.ELEMENT_NODE) { // 判断是否是name节点 if (no.getNodeName().equals("name")) { // 设置name元素节点下的文本节点内容 no.setTextContent("董宏宇"); } else if (no.getNodeName().equals("age")) { no.setTextContent("20"); } else if (no.getNodeName().equals("sex")) { no.setTextContent("男"); } else { System.out.println("没有可修改元素节点对象"); } } } // 创建TransformerFactory对象 TransformerFactory transformerFactory = TransformerFactory .newInstance(); // Transformer类用于把代表xml文件的Document对象转换为某种格式后进行输出 // transformer对象通过transformerFactory获得 Transformer transformer = transformerFactory.newTransformer(); // 把更改后的document对象重新写入到一个xml文件中 transformer.transform(new DOMSource(document), new StreamResult( new File("src//b.xml"))); } }
XML文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE classes SYSTEM "bin//dom_jiexi//java.dtd"> <classes> <java班 name="CSDNJava01班"> <teachers> <teacher name="军哥" sex="男" age="28" /> <teacher name="丽华" sex="女" age="28" /> </teachers> <students> <student id="x121"> <name>Martin</name> <sex>女</sex> <age>28</age> </student> </students> </java班> <!-- 注释0 --> <net班 name="CSDNNet01班"> <teachers> <teacher name="Boss姚" sex="男" age="28" /> <teacher name="石老师" sex="女" age="28" /> </teachers> </net班> <php班 name="CSDNPhp01班"></php班> <ios班 name="CSDNIos01班"></ios班> </classes> <!-- 对java.xml文件进行CRUD的操作 --> <!-- 节点 nodeName nodeValue nodeType element 标签名 null 1 Attr 属性名 属性值 2 text #text 文本的值 3 -->
DTD约束文件
<!ELEMENT classes (java班,net班,php班,ios班)> <!ELEMENT java班 (teachers?,students?)> <!ELEMENT net班 (teachers?,students?)> <!ELEMENT php班 (teachers?,students?)> <!ELEMENT ios班 (teachers?,students?)> <!ELEMENT teachers (teacher*)> <!ELEMENT teacher EMPTY> <!ELEMENT students (student*)> <!ELEMENT student (name,sex,age)> <!ATTLIST java班 name CDATA #IMPLIED> <!ATTLIST net班 name CDATA #IMPLIED> <!ATTLIST php班 name CDATA #IMPLIED> <!ATTLIST ios班 name CDATA #IMPLIED> <!ATTLIST teacher name CDATA #IMPLIED> <!ATTLIST teacher sex CDATA #IMPLIED> <!ATTLIST teacher age CDATA #IMPLIED> <!ELEMENT name (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ATTLIST student id ID #IMPLIED>