XML的DOM、SAX、DEMO4J及DEMO4J整合Path的代码例子
1.DMO解析
package cn.itcast.xml.dom; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class Demo1 { public static void main(String[] args) throws Exception { //1 创建JAXPDOM 解析器工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //2 通过工厂获得解析器 DocumentBuilder builder= factory.newDocumentBuilder(); //3 使用解析器解析文档得到Domcument对象 Document doc = builder.parse(new File("src/student.xml")); //........... //拿到所有的学生并打印学生信息 //1 获得所有student元素对象 NodeList students = doc.getElementsByTagName("student"); //2 遍历这些对象.取得number属性 for(int i = 0 ; i < students.getLength() ; i++ ){ /*if( students.item(i) instanceof Element){//判断是不是ELement对象 Element student = (Element)students.item(i); }*/ if(students.item(i).getNodeType() == Node.ELEMENT_NODE){ Element student = (Element)students.item(i); String number = student.getAttribute("number"); System.out.println("当前学生的学号是"+number); //3 取得子元素.遍历子元素 NodeList list = student.getChildNodes(); for(int x = 0 ; x < list.getLength() ; x++){ if(list.item(x).getNodeType() == Node.ELEMENT_NODE){ // info可能是 name age sex Element info = (Element)list.item(x); // Node nodeName ==> 标签名 if(info.getNodeName().equals("name")){ System.out.println("当前学生的姓名是"+info.getTextContent()); }else if(info.getNodeName().equals("age")){ System.out.println("当前学生的年龄是是"+info.getTextContent()); }else if(info.getNodeName().equals("sex")){ System.out.println("当前学生的性别是"+info.getTextContent()); } } } } } //4取得对应 名称 年龄 性别 } }
2.SAX解析
1.重写处理函数
package cn.itcast.xml.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyHandler extends DefaultHandler { @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("文档开始解析!"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("当前遍历的标签是"+qName); String number = attributes.getValue("number"); if(!"".equals(number) && number!=null){ System.out.println("学生的学号是:"+number); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String str =new String(ch,start,length); //去掉空白文本 str = str.trim(); if(str.length() != 0){ System.out.println("当前解析的文本是:"+str); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); System.out.println(qName+"元素解析结束"); } @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("文档结束解析!"); } }
2.使用它
package cn.itcast.xml.sax; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class Demo1 { public static void main(String[] args) throws Exception { //1 创建sax 解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); //2 获得sax解析器 SAXParser saxParser =factory.newSAXParser(); //3 使用sax解析器解析xml文档. saxParser.parse(new File("src/student.xml"), new MyHandler()); } }
3.DEMO4J
1.读取 xml文档并打印文档内容
package cn.itcast.xml.dom4j; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; public class Demo1 { //hello 读取 xml文档并打印文档内容 public static void main(String[] args) throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/student.xml"); System.out.println(document.asXML()); } }
2.取出所有学生的信息
package cn.itcast.xml.dom4j; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Demo2 { //取出所有学生的信息 public static void main(String[] args) throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/student.xml"); //通过文档对象获得 根节点 Element root = document.getRootElement(); //遍历根节点下 ,名字为student的子元素节点 for ( Iterator i = root.elementIterator( "student" ); i.hasNext(); ) { Element student = (Element) i.next(); //获得学生的number属性 String number = student.attributeValue("number"); System.out.println("学生的学号是"+number); //获得学生的子元素 for ( Iterator j = student.elementIterator(); j.hasNext(); ) { //可能是name age sex Element info = (Element) j.next(); //获得元素的元素名 if(info.getName().equals("name")){ System.out.println("学生的姓名是"+info.getText()); }else if(info.getName().equals("age")){ System.out.println("学生的年龄是"+info.getText()); }else if(info.getName().equals("sex")){ System.out.println("学生的性别是"+info.getText()); } } } } }
3.(增)增加一个学生.学号ITCAST_0003,名字 zhangsan 年龄30 性别male
package cn.itcast.xml.dom4j; import java.io.FileWriter; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Demo3 { //增加一个学生.学号ITCAST_0003,名字 zhangsan 年龄30 性别male public static void main(String[] args) throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/student.xml"); //通过文档对象获得 根节点 Element root = document.getRootElement(); //1.在根元素下添加学生元素 Element student = root.addElement("student"); //2.为学生元素添加number属性 student.addAttribute("number", "ITCAST_0003"); //3.为学生元素添加子元素name age sex //4.为子元素添加标签体 student.addElement("name").addText("zhangsan"); student.addElement("age").addText("30"); student.addElement("sex").addText("male"); //将内存中的Document会写到文件中 // Pretty print the document to System.out OutputFormat format = OutputFormat.createPrettyPrint(); //创建一个xml的写入器. 构造函数中传入 写入的文件的位置和 格式化器 XMLWriter writer = new XMLWriter( new FileWriter( "src/student_copy.xml" ), format ); writer.write( document ); writer.close(); /* //创建一个xml的写入器. 构造函数中传入 写入的文件的位置 XMLWriter writer = new XMLWriter( new FileWriter( "src/student_copy.xml" ) ); // 写入什么 writer.write( document ); //关闭并释放资源 writer.close();*/ } }
4.(改)修改一个学生.学号ITCAST_0001的学生年龄改为18
package cn.itcast.xml.dom4j; import java.io.FileWriter; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Demo4 { // 修改一个学生.学号ITCAST_0001的学生年龄改为18 public static void main(String[] args) throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/student.xml"); // 通过文档对象获得 根节点 Element root = document.getRootElement(); // 1.获取到学生元素对象集合 List<Element> list = root.elements(); // 2.遍历集合 for (int i = 0; i < list.size(); i++) { Element student = list.get(i); // 通过number属性找出要修改的student对象 if (student.attributeValue("number").equals("ITCAST_0001")) { // 3.设置student元素对象age子元素的文本为18 student.element("age").setText("18"); } } // 将内存中的Document会写到文件中 // Pretty print the document to System.out OutputFormat format = OutputFormat.createPrettyPrint(); // 创建一个xml的写入器. 构造函数中传入 写入的文件的位置和 格式化器 XMLWriter writer = new XMLWriter( new FileWriter("src/student_copy.xml"), format); writer.write(document); writer.close(); /* * //创建一个xml的写入器. 构造函数中传入 写入的文件的位置 XMLWriter writer = new XMLWriter( new * FileWriter( "src/student_copy.xml" ) ); // 写入什么 writer.write( * document ); //关闭并释放资源 writer.close(); */ } }
5.(删)删除学号ITCAST_0001的学生
package cn.itcast.xml.dom4j; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Demo6 { // 删除学号ITCAST_0001的学生 public static void main(String[] args) throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/student.xml"); // 通过文档对象获得 根节点 Element root = document.getRootElement(); //1.获取要删除的学生元素(xpath) String xpath = "//student[@number='ITCAST_0001']"; Element student = (Element) root.selectSingleNode(xpath); //2.删除(找父节点删) root.remove(student); // 将内存中的Document会写到文件中 // Pretty print the document to System.out OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); // 创建一个xml的写入器. 构造函数中传入 写入的文件的位置和 格式化器 XMLWriter writer = new XMLWriter( new FileOutputStream(new File("src/stu.xml")), format); writer.write(document); writer.close(); /** //创建一个xml的写入器. 构造函数中传入 写入的文件的位置 XMLWriter writer = new XMLWriter( new * FileWriter( "src/student_copy.xml" ) ); // 写入什么 writer.write( * document ); //关闭并释放资源 writer.close(); */ } }
6.整合Xpath
package cn.itcast.xml.dom4j; import java.io.FileWriter; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Demo5 { // 修改一个学生.学号ITCAST_0001的学生年龄改为18 public static void main(String[] args) throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/student.xml"); // 通过文档对象获得 根节点 Element root = document.getRootElement(); // 定义xpath表达式 String xpath = "//student[@number='ITCAST_0001']"; // 通过表达式 选取对应的元素 Element student = (Element) document.selectSingleNode(xpath); //修改 student.element("age").setText("18"); // 将内存中的Document会写到文件中 // Pretty print the document to System.out OutputFormat format = OutputFormat.createPrettyPrint(); // 创建一个xml的写入器. 构造函数中传入 写入的文件的位置和 格式化器 XMLWriter writer = new XMLWriter( new FileWriter("src/student_copy.xml"), format); writer.write(document); writer.close(); /* * //创建一个xml的写入器. 构造函数中传入 写入的文件的位置 XMLWriter writer = new XMLWriter( new * FileWriter( "src/student_copy.xml" ) ); // 写入什么 writer.write( * document ); //关闭并释放资源 writer.close(); */ } }