dom4j和document
DOM的优点和缺点:
优点:DOM操作思维清晰,简单
缺点:在操作大量数据的时候性能,不能保证
DOM(Document Object Model)
// 表示出需要被操作的XML文件的路径,注意是文件的路径,不是文件所在的目录 private File f = new File("D:\\workspace\\dom4jAndDocument\\contacts.xml"); @Test public void testGetDocument() throws Exception{ // 根据DocumentBuilderFactory类,来获取DocumentBuilderFactory对象 // 注意:工厂设计模式往往体现着单列设计模式 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 根据DocumentBuilderFactory对象,创建DocumentBuilder对象 // 注意:XxxFactory,就是用来创建Xxx对象的 DocumentBuilder builder = factory.newDocumentBuilder(); // 根据DocumentBuilder对象,构建Document对象 Document parse = builder.parse(f); System.out.println(parse); }
什么时候使用newDocument,什么时候使用parse方法呢?
一般的,当一个XML文件已经存在,我们就只需要去解析即可. -->parse
什么叫解析:把一个数据,从简单类型(String)转换为描述该数据的类型.
如:String time = "2019-11-25",字符串的时间
Date date = DateFormat对象.parse(String time)
当一个XML文件不存在的时候,我们使用newDocument
// 从contacts.xml文件中获取第二个联系人的名字 @Test public void test1() throws Exception{ // 1):获取Document文本对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document parse = builder.parse(f); // 2):获取XML的根元素对象:contacts. Element element = parse.getDocumentElement(); // 3):获取根元素下的第二个linkman元素 NodeList nodeList = element.getElementsByTagName("linkman"); Node linkmanEl =(Element) nodeList.item(1); // 4):获取该linkman元素下的第一个name元素 Element nameEl = (Element) ((Element) linkmanEl).getElementsByTagName("name").item(0); // 5):获取该name元素的文本内容. String name = nameEl.getTextContent(); Assert.assertEquals("Will",name); System.out.println(name); }
// 从contacts.xml文件中修改一个联系人的邮箱地址 @Test public void test2() throws Exception{ // 1):获取Document文本对象 Document doc = DocumentBuilderFactory .newInstance().newDocumentBuilder().parse(f); // 2):获取根元素对象 Element root = doc.getDocumentElement(); // 3):获取第一个linkman元素 Node linkmanEl = root.getElementsByTagName("linkman").item(0); // 4);获取该linkman元素下的第一个email元素 Element emailEl = (Element) ((Element) linkmanEl).getElementsByTagName("email").item(0); // 5):修改该email元素的文本内容 emailEl.setTextContent("renxiaolong@520it.com"); // 6):同步操作 TransformerFactory factory = TransformerFactory.newInstance(); Transformer trans = factory.newTransformer(); Source source = new DOMSource(doc); // 内存中的Document对象 Result result = new StreamResult(f); // 磁盘中的xml文件对象 trans.transform(source,result); }
// 从contacts.xml文件中增加一个联系人信息 @Test public void test3() throws Exception{ // 1):获取Document文本对象 Document doc = DocumentBuilderFactory .newInstance().newDocumentBuilder().parse(f); // 2):获取根元素对象 Element root = doc.getDocumentElement(); // 3):创建一个linkman元素的片段 // 3.1:创建linkman,name,email,address,group5个元素 Element linkmanEl = doc.createElement("linkman"); Element nameEl = doc.createElement("name"); Element emailEl = doc.createElement("email"); Element addressEl = doc.createElement("address"); Element groupEl = doc.createElement("group"); // 3.2:设置name,email,address,group的文本内容 nameEl.setTextContent("小明"); emailEl.setTextContent("xaomin@520it.com"); addressEl.setTextContent("中国"); groupEl.setTextContent("听闻"); // 3.3:建立元素之间的层次关系: // 3.3.1:把name,email,address,group四个作为linkman元素的子元素 linkmanEl.appendChild(nameEl); linkmanEl.appendChild(emailEl); linkmanEl.appendChild(addressEl); linkmanEl.appendChild(groupEl); // 3.3.2:把linkman元素,作为根元素的子元素 root.appendChild(linkmanEl); // 4):同步操作 Transformer trans = TransformerFactory.newInstance().newTransformer(); trans.transform(new DOMSource(doc), new StreamResult(f)); }
// 设置和获取第三个联系人的id属性 @Test public void test4() throws Exception { // 1):获取Document文本对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(f); // 2):获取根元素对象 Element element = doc.getDocumentElement(); // 3):获取第三个linkman元素 NodeList linkman = element.getElementsByTagName("linkman"); Node linkmanEl =linkman.item(2); // 获取id属性 String map = ((Element) linkmanEl).getAttribute("id"); System.out.println(map); // 设置id属性:1234 ((Element) linkmanEl).setAttribute("id","1234"); // 4):同步操作 Transformer trans = TransformerFactory.newInstance().newTransformer(); trans.transform(new DOMSource(doc), new StreamResult(f)); }
// 删除第三个联系人信息 @Test public void test5() throws Exception{ // 1):获取Document文本对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(f); // 2):获取根元素对象 Element root = doc.getDocumentElement(); // 3):获取第三个linkman元素 NodeList linkman = root.getElementsByTagName("linkman"); Node linkmanEl = linkman.item(3); // 4):删除第三个linkman元素 // 请自己的老爸来干掉自己 root.removeChild(linkmanEl); // 5):同步操作 Transformer trans = TransformerFactory.newInstance().newTransformer(); trans.transform(new DOMSource(doc), new StreamResult(f)); }
// 在内存中创建一个Document对象 @Test public void test6() throws Exception { Document doc = null; // 如果文件存在,则直接解析 // 如果文件不存在,则应该在内存中先创建Document对象 DocumentBuilder builder = DocumentBuilderFactory .newInstance().newDocumentBuilder(); if (f.exists()) { // 如果文件存在 doc = builder.parse(f); } else { // 如果文件不存在 doc = builder.newDocument(); // 设置Xml信息 doc.setXmlVersion("1.0"); // 创建根元素 Element root = doc.createElement("contacts"); // 把根元素设置为文档的儿子元素 doc.appendChild(root); } // 获取根元素对象 Element root = doc.getDocumentElement(); // 创建一个linkman元素的片段 // 创建linkman,name,email,address,group5个元素 Element linkmanEl = doc.createElement("linkman"); Element nameEl = doc.createElement("name"); Element emailEl = doc.createElement("email"); Element addressEl = doc.createElement("address"); Element groupEl = doc.createElement("group"); // 设置name,email,address,group的文本内容 nameEl.setTextContent("小明"); emailEl.setTextContent("xaomin@520it.com"); addressEl.setTextContent("中国"); groupEl.setTextContent("听闻"); // 建立元素之间的层次关系: // 把name,email,address,group四个作为linkman元素的子元素 linkmanEl.appendChild(nameEl); linkmanEl.appendChild(emailEl); linkmanEl.appendChild(addressEl); linkmanEl.appendChild(groupEl); // 3.3.2:把linkman元素,作为根元素的子元素 root.appendChild(linkmanEl); // 同步操作 Transformer trans = TransformerFactory.newInstance().newTransformer(); trans.transform(new DOMSource(doc), new StreamResult(f)); }
DOM4j(DOM for Java(为Java提供的DOM操作的API))
使用DOM4J需要导入的Jar包:dom4j-1.6.1.jar
// 使用DOM4j从contacts.xml文件中查询所有联系人的信息 private File f = new File("D:\\workspace\\dom4jAndDocument\\contacts.xml"); @Test public void testQueryAll() throws Exception{ // 获取Document对象 SAXReader reader = new SAXReader(); Document read = reader.read(f); // 获取根元素 Element root = read.getRootElement(); // 获取根元素中所有的linkman元素 List<Element> linkman = root.elements("linkman"); for (Element like:linkman) { // 获取linkman元素的id属性 String id = like.attributeValue("id"); // 获取linkman元素下的name,email,address,group子元素的文本内容 String name = like.elementText("name"); String email = like.elementText("email"); String address = like.elementText("address"); String group = like.elementText("group"); System.out.println(id + "," + name + "," + email + "," + address + "," + group); } }
// 使用DOM4j新增一个联系人的信息到contacts.xml文件中 @Test public void testInsert() throws Exception { // 获取Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(f); // 获取根元素 Element root = doc.getRootElement(); // 创建linkman元素,并设置为根元素的子元素 Element linkman = root.addElement("linkman"); // 为linkman元素设置id属性 linkman.addAttribute("id", "4"); // 为linkman创建子元素:name,email,address,group linkman.addElement("name").setText("西门吹雪"); linkman.addElement("email").setText("飞鸽传书"); linkman.addElement("address").setText("万梅山庄"); linkman.addElement("group").setText("武侠"); // 同步操作 OutputFormat format = OutputFormat.createPrettyPrint(); // 对xml做格式化效果 // 设置编码 format.setEncoding("UTF-8"); // format = OutputFormat.createCompactFormat(); // 把xml文件的数据,转换为一行 XMLWriter writer = new XMLWriter(new FileWriter(f), format); writer.write(doc); writer.close(); // 关闭流 }