1、XML解析分为:dom解析和sax解析
•dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
•sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
2、获得JAXP中的DOM解析器步骤
①调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
②调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
③调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
3、实例代码之读取信息
XML:
<?xml version="1.0" encoding="UTF-8"?> <Class> <stu id='1'> <name>小猫</name> <age>25</age> </stu> <stu id='2'> <name>小明</name> <age>24</age> </stu> </Class>
crud:
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 TestXml { public static void main(String[] args) { try { // 创建一个DocumentBuilderFactory DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 创建解析器 DocumentBuilder db = dbf.newDocumentBuilder(); // 解析文档,得到Document对象 Document doc = db.parse("class.xml"); // 遍历 listDoc(doc); listDocValue(doc); // 修改 updateDoc(doc); // 删除 removeDoc(doc); // 新增 addDoc(doc); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 遍历XML的节点 private static void listDoc(Node node) { // 判断是不是元素节点 if (node.getNodeType() == Node.ELEMENT_NODE) { System.out.println(node.getNodeName()); } // 获取node的子节点 NodeList nodeList = node.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { listDoc(nodeList.item(i)); } } // 遍历每个节点的值 private static void listDocValue(Document doc) { NodeList nodeList = doc.getElementsByTagName("stu"); Element element = null; for (int i = 0; i < nodeList.getLength(); i++) { element = (Element) nodeList.item(i); System.out.println("学号:" + element.getAttribute("id")); System.out.println("姓名:" + element.getElementsByTagName("name").item(0) .getFirstChild().getNodeValue()); System.out.println("年龄:" + element.getElementsByTagName("age").item(0) .getFirstChild().getNodeValue()); } } // 修改第一个学生的姓名 private static void updateDoc(Document doc) { NodeList nodeList = doc.getElementsByTagName("stu"); Element element = (Element) nodeList.item(0); element.getElementsByTagName("name").item(0).setTextContent("小东"); saveDoc(doc, "class.xml"); } // 删除第一个学生的属性,删除第二个学生 private static void removeDoc(Document doc) { NodeList nodeList = doc.getElementsByTagName("stu"); Element stu1 = (Element) nodeList.item(0); stu1.removeAttribute("id"); Element element = (Element) nodeList.item(1); element.getParentNode().removeChild(element); // 保存 saveDoc(doc, "class.xml"); } // 新增一个学生 private static void addDoc(Document doc) { // 创建节点 Element stu = doc.createElement("stu"); Element stu_name = doc.createElement("name"); Element stu_age = doc.createElement("age"); // 设置属性、节点值 stu.setAttribute("id", "3"); stu_name.setTextContent("小丽"); stu_age.setTextContent("23"); // 添加到stu节点 stu.appendChild(stu_name); stu.appendChild(stu_age); // 将新学生添加到根节点 doc.getDocumentElement().appendChild(stu); // 保存 saveDoc(doc, "class.xml"); } // 将cud操作后的结果保存 private static void saveDoc(Document doc, String path) { try { // 获取TransformerFactory TransformerFactory transformerFactory = TransformerFactory .newInstance(); transformerFactory.setAttribute("indent-number",2); // 获取转换器实例 Transformer transformer = transformerFactory.newTransformer(); //格式化,实现缩进 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2"); // 存储 transformer.transform(new DOMSource(doc), new StreamResult(path)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
4、案例:基于xml的学生成绩维护系统:
XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <students> <student sid="001"> <name>小明</name> <course> <java>90</java> <oracle>90</oracle> <vb>89</vb> </course> </student> <student sid="002"> <name>小李</name> <course> <java>9</java> <oracle>70</oracle> <vb>8</vb> </course> </student> <student sid="003"> <name>小韩</name> <course> <java>90</java> <oracle>70</oracle> <vb>85</vb> </course> </student> <student sid="004"> <name>小明名</name> <course> <java>34</java> <oracle>50</oracle> <vb>58</vb> </course> </student> <student sid="005"> <name>小红</name> <course> <java>29</java> <oracle>39</oracle> <vb>88</vb> </course> </student> <student sid="006"> <name>小米</name> <course> <java>99</java> <oracle>99</oracle> <vb>67</vb> </course> </student> </students>
CRUD:package com.exercise.dom; import java.util.Scanner; 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.NodeList; public class DomExercise { private Scanner scanner = new Scanner(System.in); private Document doc; public static void main(String[] args) { DomExercise domExercise = new DomExercise(); domExercise.doc = getDocument(); domExercise.show(); } public void show() { String option = ""; do { System.out.println("查看所有学生的成绩------view"); System.out.println("按照学生学号查询学生成绩-----query"); System.out.println("添加一个学生-----add"); System.out.println("按照学号更改一个学生的信息-----change"); System.out.println("按照学号去删除一个学生------remove"); System.out.println("保存学生信息-----save"); System.out.println("退出系统--------exit"); System.out.println("请输入你要的操作:"); option = scanner.next(); if (option.equals("view")) { showAllScores(); } else if (option.equals("query")) { queryById(); } else if (option.equals("add")) { addStu(); } else if (option.equals("change")) { changeInfo(); } else if (option.equals("remove")) { removeStu(); } else if (option.equals("save")) { saveInfo(); } else if (option.equals("exit")) { System.exit(0); } } while (true); } // 根据学号 删除学生 private void removeStu() { System.out.println("请输入你要删除的学生的学号:"); String sid = scanner.next(); // 获取所有student节点 NodeList nodeList = doc.getElementsByTagName("student"); // 删除对应学号的学生 for (int i = 0; i < nodeList.getLength(); i++) { Element element = (Element) nodeList.item(i); if (element.getAttribute("sid").equals(sid)) { element.getParentNode().removeChild(nodeList.item(i)); break; } } } // 根据学号修改学生信息 private void changeInfo() { System.out.println("请输入你要修改的学生的学号:"); String sid = scanner.next(); // 获取所有student节点 NodeList nodeList = doc.getElementsByTagName("student"); Element element = null; // 遍历获取的所有student节点,获取对应学号的学生信息 for (int i = 0; i < nodeList.getLength(); i++) { element = (Element) nodeList.item(i); if (element.getAttribute("sid").equals(sid)) { System.out.println("学号=" + element.getAttribute("sid") + "\t\t姓名=" + getElementValue(element, "name") + "\tJava=" + getElementValue(element, "java") + "\tOracle=" + getElementValue(element, "oracle") + "\tVB=" + getElementValue(element, "vb")); break; } } System.out.println("修改学号-----1"); System.out.println("修改姓名-----2"); System.out.println("修改Java成绩-----3"); System.out.println("修改Oracle成绩-----4"); System.out.println("修改VB成绩-----5"); System.out.println("请选择您要修改的信息:"); String inStr = scanner.next(); if (inStr.equals("1")) { System.out.println("请输入新学号:"); String newSid = scanner.next(); element.setAttribute("sid", newSid); } else if (inStr.equals("2")) { System.out.println("请输入新姓名:"); String newName = scanner.next(); element.getElementsByTagName("name").item(0) .setTextContent(newName); } else if (inStr.equals("3")) { System.out.println("请输入新Java成绩:"); String newJava = scanner.next(); element.getElementsByTagName("java").item(0) .setTextContent(newJava); } else if (inStr.equals("4")) { System.out.println("请输入新Oracle成绩:"); String newOracle = scanner.next(); element.getElementsByTagName("oracle").item(0) .setTextContent(newOracle); } else if (inStr.equals("5")) { System.out.println("请输入新VB成绩:"); String newVB = scanner.next(); element.getElementsByTagName("vb").item(0).setTextContent(newVB); } System.out.println("修改后:"); System.out.println("学号=" + element.getAttribute("sid") + "\t\t姓名=" + getElementValue(element, "name") + "\tJava=" + getElementValue(element, "java") + "\tOracle=" + getElementValue(element, "oracle") + "\tVB=" + getElementValue(element, "vb")); } // 添加学生 private void addStu() { System.out.println("添加一个新学生:"); System.out.println("请输入学号:"); String sid = scanner.next(); System.out.println("请输入姓名:"); String name = scanner.next(); System.out.println("请输入java成绩:"); String javaScore = scanner.next(); System.out.println("请输入oracle成绩:"); String oracleScore = scanner.next(); System.out.println("请输入VB成绩:"); String vbScore = scanner.next(); // 创建节点 Element stu = doc.createElement("student"); Element stu_name = doc.createElement("name"); Element stu_course = doc.createElement("course"); Element stu_java = doc.createElement("java"); Element stu_oracle = doc.createElement("oracle"); Element stu_vb = doc.createElement("vb"); // 设置属性、节点值 stu.setAttribute("sid", sid); stu_name.setTextContent(name); stu_java.setTextContent(javaScore); stu_oracle.setTextContent(oracleScore); stu_vb.setTextContent(vbScore); // 添加节点 stu.appendChild(stu_name); stu.appendChild(stu_course); stu_course.appendChild(stu_java); stu_course.appendChild(stu_oracle); stu_course.appendChild(stu_vb); // 添加到根节点 doc.getFirstChild().appendChild(stu); } // 根据输入的学号查询学生成绩 private void queryById() { System.out.println("请输入学号:"); String sid = scanner.next(); // 获取所有student节点 NodeList nodeList = doc.getElementsByTagName("student"); // 遍历获取的所有student节点,获取对应学号的学生信息 for (int i = 0; i < nodeList.getLength(); i++) { Element element = (Element) nodeList.item(i); if (element.getAttribute("sid").equals(sid)) { System.out.println("学号=" + element.getAttribute("sid") + "\t\t姓名=" + getElementValue(element, "name") + "\tJava=" + getElementValue(element, "java") + "\tOracle=" + getElementValue(element, "oracle") + "\tVB=" + getElementValue(element, "vb")); } } } // 获取document private static Document getDocument() { Document doc = null; try { // 创建DocumentBuilderFactory DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory .newInstance(); // 创建解析器 DocumentBuilder documentBuilder = documentBuilderFactory .newDocumentBuilder(); // 获取document doc = documentBuilder.parse("src/com/exercise/dom/exercise.xml"); } catch (Exception e) { e.printStackTrace(); } return doc; } // 显示所有学生的成绩 private void showAllScores() { System.out.println("显示所有学生的成绩:"); // 获取所有的student节点 NodeList nodeList = doc.getElementsByTagName("student"); // 遍历获取的所有student节点下的信息 for (int i = 0; i < nodeList.getLength(); i++) { Element element = (Element) nodeList.item(i); System.out.println("学号=" + element.getAttribute("sid") + "\t\t姓名=" + getElementValue(element, "name") + "\tJava=" + getElementValue(element, "java") + "\tOracle=" + getElementValue(element, "oracle") + "\tVB=" + getElementValue(element, "vb")); } } // 获取element的信息 private String getElementValue(Element element, String tagName) { return element.getElementsByTagName(tagName).item(0).getTextContent(); } // 保存学生信息 private void saveInfo() { try { // 创建TransformerFactory TransformerFactory transformerFactory = TransformerFactory .newInstance(); // 创建转换器 Transformer transformer = transformerFactory.newTransformer(); // 格式化,实现缩进 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty( "{http://xml.apache.org/xalan}indent-amount", "2"); // 转换 transformer.transform(new DOMSource(doc), new StreamResult( "src/com/exercise/dom/exercise.xml")); } catch (Exception e) { e.printStackTrace(); } System.out.println("保存成功!"); } }