简介
文档结构
XML组成
标签编写注意事项
转义符
解析XML技术
使用DOM解析XML

public void loadDocument() { // 1、创建解析器工厂实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 2、从解析器工厂实例中获取一个解析器实例 try { DocumentBuilder builder = factory.newDocumentBuilder(); // 3、解析XML文件,得到DOM树 doc = builder.parse("收藏信息.xml"); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
解析XML文件

public void showInfo() { // 1、获取所有brand NodeList brandList = doc.getElementsByTagName("Brand"); // 2、遍历所有的brand标签 for (int i = 0; i < brandList.getLength(); i++) { Node brandNode = brandList.item(i); Element brandEle = (Element) brandNode; String brandStr = brandEle.getAttribute("name"); // 获取brand的所有子节点 NodeList typeList = brandEle.getChildNodes(); // 遍历所有type标签 for (int j = 0; j < typeList.getLength(); j++) { Node typeNode = typeList.item(j); // 如果当前Node是一个Element,则进行转换 if (typeNode.getNodeType() == Node.ELEMENT_NODE) { Element typeEle = (Element) typeNode; // 获取此Element的Name属性值 String typeStr = typeEle.getAttribute("name"); System.out.println("手机品牌:" + brandStr + ",型号" + typeStr); } } } }
保存XML文件

public void saveXML(String path) { // 1、创建一个转换工厂 TransformerFactory factory = TransformerFactory.newInstance(); // 2、使用转换工厂创建一个转换器 try { Transformer former = factory.newTransformer(); // 设置转换器的编码格式 former.setOutputProperty(OutputKeys.ENCODING, "gb2312"); // 3、进行转换 源(DOM树)——>目标(XML文件) Source xmlSource = new DOMSource(doc); Result outputTarget = new StreamResult(path); former.transform(xmlSource, outputTarget); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } }
添加DOM节点

public void addNewPhoneInfo() { // 1、创建一个brand节点 Element newBrand = doc.createElement("Brand"); newBrand.setAttribute("name", "三星"); // 2、创建一个type节点 Element newType = doc.createElement("type"); newType.setAttribute("name", "Note4"); // 3、将type节点作为brand的子节点 newBrand.appendChild(newType); // 4、将brand挂到DOM树 doc.getElementsByTagName("PhoneInfo").item(0).appendChild(newBrand); }
修改/删除DOM节点

public void modifyPhoneInfo() { // 1、找到name值为三星的brand节点 NodeList brandList = doc.getElementsByTagName("Brand"); for (int i = 0; i < brandList.getLength(); i++) { Node brandNode = brandList.item(i); Element brandEle = (Element) brandNode; if (brandEle.getAttribute("name").equals("三星")) { // 2、修改节点的name属性值 brandEle.setAttribute("name", "SAMSUNG"); } } }

public void delPhoneInfo() { // 1、找到name值为三星的brand节点 NodeList brandList = doc.getElementsByTagName("Brand"); for (int i = 0; i < brandList.getLength(); i++) { Node brandNode = brandList.item(i); Element brandEle = (Element) brandNode; if (brandEle.getAttribute("name").equals("SAMSUNG")) { // 2、使用这个节点的父节点来删除它 brandEle.getParentNode().removeChild(brandEle); } } }
使用DOM4J解析XML

import java.io.FileWriter; import java.io.IOException; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class TestDOM4J { Document doc = null; /** * 加载DOM树 */ public void loadDocument() { SAXReader saxReader = new SAXReader(); try { doc = saxReader.read("收藏信息.xml"); } catch (DocumentException e) { e.printStackTrace(); } } /** * 显示所有信息 */ public void showInfo() { Element root = doc.getRootElement(); Iterator itBrand = root.elementIterator(); while (itBrand.hasNext()) { Element brandEle = (Element) itBrand.next(); String brandStr = brandEle.attributeValue("name"); Iterator itType = brandEle.elementIterator(); while (itType.hasNext()) { Element typeEle = (Element) itType.next(); String typeStr = typeEle.attributeValue("name"); System.out.println("手机品牌:" + brandStr + ",型号:" + typeStr); } } } /** * 保存XML */ public void saveXML(String path) { OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("gb2312"); try { XMLWriter writer = new XMLWriter(new FileWriter(path), format); writer.write(doc); writer.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 添加一个节点 */ public void addPhoneInfo() { Element root = doc.getRootElement(); // 创建一个brand节点 Element brandEle = root.addElement("Brand"); // 给Brand节点设置属性 brandEle.addAttribute("name", "三星"); // 创建Type节点 Element typeEle = brandEle.addElement("Type"); typeEle.addAttribute("name", "Note4"); this.saveXML("新的收藏信息.xml"); } /** * 修改节点信息 */ public void modifyPhoneInfo() { Element root = doc.getRootElement(); int id = 0; Iterator itBrand = root.elementIterator(); // 遍历后获取每个brand节点 while (itBrand.hasNext()) { id++; Element brandEle = (Element) itBrand.next(); brandEle.addAttribute("id", id + ""); } this.saveXML("新的收藏信息.xml"); } /** * 删除节点信息 */ public void delPhoneInfo() { Element root = doc.getRootElement(); Iterator itBrand = root.elementIterator(); while (itBrand.hasNext()) { Element brandEle = (Element) itBrand.next(); if (brandEle.attributeValue("name").equals("三星")) { brandEle.getParent().remove(brandEle); } } this.saveXML("新的收藏信息.xml"); } public static void main(String[] args) { TestDOM4J parse = new TestDOM4J(); parse.loadDocument(); parse.saveXML("新的收藏信息.xml"); parse.addPhoneInfo(); parse.modifyPhoneInfo(); parse.delPhoneInfo(); parse.showInfo(); } }