解析XML
来源:互联网 发布:linux ftp命令怎么用 编辑:程序博客网 时间:2024/06/05 21:00
1.什么是解析xml?
系统最终会从xml中读取数据.读取的过程就是解析.CRUD => 增删改查 => create read update delete => 解析指的就是读.
2.什么是解析器?
就是用来解析xml的类.过滤器,拦截器,监听器....都是具备相应功能的java类而已.
3.两个常见的解析xml的思路!.
思想: DOM:将文档中所有内容都封装成对象.读取时,将所有对象都加载到内存中.在内存中创建一颗dom树(记录对象间的关系). 优点: 方便的进行增删改查. 缺点: 会非常消耗内存.sax:事件驱动的.与pull解析(安卓)类似.把xml文档的 读取过程,划分出5类事件.我们只要提供遇到每类事件做什么的锦囊即可. 优点:内存占用小. 缺点: 不能进行增删改的操作.DOM解析是由w3c推荐提出的.Sax解析是由民间提出的.
DOM:
把所有内容封装成了5类对象. document Element Attribute Text Commons 共同的父类 node NOde的属性: 自身属性: nodeType nodeName nodeValue 导航属性 找子节点的:firstChild lastChild childNodes 找父节点的:parentNode 找兄弟节点:nextSibling previousSibling 获得Element的方式 getElementById ==> Document getELementsByTagName ==> Document/Element getELementsByClassName ==> Document/Element getElementsByName ==> Document 对于增删改的操作: 创建一个元素: document.createElement 添加一个元素: element.appendChild ,element.insertBefore 替换一个元素: element.replaceChild 删除一个元素: element.removeChild
3.JAXP ==> JDK提供的 ==> java api for xml parser
思想在java中的体现是接口. 我们要开发的话需要接口的实现类.由各大解析器厂商提供实现接口的类.A a = new AImpl(); // Aimpl2;A a = new AImpl2();
//—上面的切换实现类的方式,需要该源代码,太过原始—–
A a = JAXP.getXXX();==> 配置文件 ==> 我们通过修改配置文件就可以实现切换实现类.
//反射.泛型.
//——————————————————————————————
DOM4J ==> 框架 ==>
Dom for java
DOM4J
//——————————————————————————————-
DOM4J 整合两种思想.(SAX DOM)的思想.
使用sax的思想做读取xml.
又参照dom的思想,也在内存中创建了一颗对象关系树. 我们在学习的时候,参照之前我们学习的dom树即可.
//使用dom4j如何避免乱码?//要保证写入的编码和读取的编码一致. 1.写入的编码如何控制? XMLWriter writer = new XMLWriter(new PrintWriter("src/students_copy.xml","UTF-8"),format); 2.读取的编码如何控制? <?xml version="1.0" encoding="GBK"?>,其中encoding属性决定了读取时采用什么编码,而encoding属性由format.setEncoding("GBK");控制.//其实要保证不乱码上面的方法太弱了! 方法: 使用字节流绝对不会出现乱码!如下: XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"),format);
JAXP
这是配置文件的简单实现
public class BeanFactory { private static Properties prop = new Properties(); static{ //1.读取配置文件 try { prop.load(new FileInputStream("src/beanFactory.properties")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static <T> T getBean(Class<T> c){ //1.读取配置文件 try { //2.取出用哪个实现类 String className = prop.getProperty(c.getSimpleName()); //3.根据完整类名创建实例并返回 Class<T> clazz = (Class<T>) Class.forName(className); return clazz.newInstance(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }}
Dom4J解析案例
dom4j是学习的重点,一定要会。
// 读取xmlpublic class Demo1 { public static void main(String[] args) { SAXReader reader = new SAXReader(); try { Document document = reader.read(new File("src/students.xml")); System.out.println(document.asXML()); } catch (Exception e) { e.printStackTrace(); } }}
// 查询出所有学生的所有信息public class Demo2_2 { public static void main(String[] args) { try { SAXReader reader = new SAXReader(); Document document = reader.read(new File("src/students.xml")); //1.获得根元素 Element root = document.getRootElement(); //2.迭代根元素下的所有名叫student的子元素 List<Element> list = root.elements("student"); for(Element student : list){ //3.获得student元素的number属性 String number = student.attributeValue("number"); //4.student子元素的内容(name age sex) String name = student.elementText("name"); String age = student.elementText("age"); String sex = student.elementText("sex"); System.out.println("当前学生的学号是"+number+",姓名是:"+name+",年龄是:"+age+",性别是"+sex+""); } } catch (Exception e) { e.printStackTrace(); } }}
// 查询出所有学生的所有信息public class Demo2 { public static void main(String[] args) { try { SAXReader reader = new SAXReader(); Document document = reader.read(new File("src/students.xml")); //1.获得根元素 Element root = document.getRootElement(); //2.迭代根元素下的所有名叫student的子元素 for(Iterator<Element> it = root.elementIterator("student");it.hasNext();){ Element student = it.next(); //3.获得student元素的number属性 String number = student.attributeValue("number"); //4.student子元素的内容(name age sex) String name = student.elementText("name"); String age = student.elementText("age"); String sex = student.elementText("sex"); System.out.println("当前学生的学号是"+number+",姓名是:"+name+",年龄是:"+age+",性别是"+sex+""); } } catch (Exception e) { e.printStackTrace(); } }}
// 增加一个学生元素. jack itcast_0003 19 malepublic class Demo3 { public static void main(String[] args) { SAXReader reader = new SAXReader(); try { Document document = reader.read(new File("src/students.xml")); //1 获得根元素 Element root = document.getRootElement(); //2 添加Element,添加number属性, Element studentEle = root.addElement("student").addAttribute("number", "itcast_0003"); //3 添加name age sex 子元素并添加子元素中的文本 studentEle.addElement("name").addText("张三"); studentEle.addElement("age").addText("19"); studentEle.addElement("sex").addText("male"); //4 将document对象写到文件中. //创建格式化器 OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); //创建写入器 //XMLWriter writer = new XMLWriter(new FileWriter("src/students_copy.xml"),format); XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"),format); //写入 writer.write(document); //关闭资源 writer.close();
// 删除一个学生 itcast_0001public class Demo4 { public static void main(String[] args) { SAXReader reader = new SAXReader(); try { Document document = reader.read(new File("src/students.xml")); //1 获得根元素 Element root = document.getRootElement(); //使用xpath找到我们需要元素 //定义xpath String xpath = "//student[@number='itcast_0001']"; Element student = (Element) document.selectSingleNode(xpath); //删除 System.out.println(student.getParent().remove(student)); //回写 XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"), OutputFormat.createPrettyPrint()); writer.write(document); writer.close(); //下面这个思路可以.但是效率太低. //2 获得所有学生元素 //3 遍历 //判断=>number属性是否为要删除的 //是==>删除 //不是 //4 回写 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
//修改一个学生 itcast_0001 ==> rose 16 femalepublic class Demo5 { public static void main(String[] args) { SAXReader reader = new SAXReader(); try { Document document = reader.read(new File("src/students.xml")); //1.定义xpath表达式 String xpath ="//student[@number='itcast_0001']"; //2.使用xpath查找 Element studentEle = (Element) document.selectSingleNode(xpath); //3.修改student元素的子元素的name ,age .sex内容 studentEle.element("name").setText("rose"); studentEle.element("age").setText("16"); studentEle.element("sex").setText("female"); //回写 XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"), OutputFormat.createPrettyPrint()); writer.write(document); writer.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
crud
public class StudentDaoImpl implements StudentDao { @Override public void saveStudent(Student stu) { try { Document doc = getDocument(); Element root = doc.getRootElement(); // 4.在根元素上添加student子元素,添加属性 Element studentEle = root.addElement("student").addAttribute( "number", stu.getNumber()); // 5. 在student上添加name,age,sex子元素并添加内容 studentEle.addElement("name").setText(stu.getName()); studentEle.addElement("age").setText(stu.getAge() + ""); studentEle.addElement("sex").setText(stu.getSex()); save2File(doc); } catch (Exception e) { e.printStackTrace(); } } private void save2File(Document doc) throws UnsupportedEncodingException, FileNotFoundException, IOException { // 6.回写 // 1>创建OutputFormat OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); // 2>创建xmlwriter XMLWriter writer = new XMLWriter(new FileOutputStream( "src/students_copy.xml"), format); // 3>写入 writer.write(doc); // 4>释放资源 writer.close(); } private Document getDocument() throws DocumentException { // 1.创建解析器 SAXReader reader = new SAXReader(); // 2.加载xml文件 ==> doc Document doc = reader.read(new File("src/students_copy.xml")); // 3.获得根元素 return doc; } @Override public void deleteStudent(String number) { try { Document doc = getDocument(); Element root = doc.getRootElement(); Iterator<Element> it = root.elementIterator("student"); while(it.hasNext()){ Element student = it.next(); if (student.attributeValue("number").equals(number)) { student.getParent().remove(student); } } save2File(doc); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void deleteStudent(Student stu) { try { Document doc = getDocument(); Element root = doc.getRootElement(); Iterator<Element> it = root.elementIterator("student"); while(it.hasNext()){ Element student = it.next(); if (student.attributeValue("number").equals(stu.getNumber())) { student.getParent().remove(student); } } save2File(doc); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void updateStudent(Student stu) { } @Override public Student getStudentByNumber(String number) { try { Student students = new Student(); Document doc = getDocument(); Element root = doc.getRootElement(); List<Element> list = root.elements("student"); for(Element student : list){ if(student.attribute("number").getValue().equals(number)){ String name = students.getName(); name=student.elementText("name"); int age = students.getAge(); age =Integer.parseInt( student.element("age").getText()); String sex = students.getSex(); sex = student.element("sex").getText(); String num = students.getNumber(); num = student.attribute("number").getValue(); students.setAge(age); students.setName(name); students.setNumber(number); students.setSex(sex); return students; } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public List<Student> getAllStudent() { Document doc; List<Student> li = new ArrayList(); try { doc = getDocument(); Element root = doc.getRootElement(); List<Element> list = root.elements("student"); for(Element s : list){ Student s1 = new Student(); String name = s.elementText("name"); String sex = s.elementText("sex"); String age = s.elementText("age"); String number = s.attributeValue("number"); s1.setAge(Integer.parseInt(age)); s1.setName(name); s1.setSex(sex); s1.setNumber(number); li.add(s1); } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } return li; }}
0 0
- XML解析
- xml解析
- XML解析
- 解析XML
- xml解析
- 解析xml
- 解析xml
- xml解析
- XML解析
- xml解析
- XML解析
- xml解析
- xml解析
- xml解析
- xml解析
- xml解析
- 解析xml
- XML解析
- tcp的简单应用
- 104. Maximum Depth of Binary Tree
- 多线程 -- 初学简单例子
- [leetcoed]3. Longest Substring Without Repeating Characters
- ios 自动布局
- 解析XML
- awk 实例练习(二)
- Poj 1067 取石子游戏
- strcpy函数的实现
- MYSQL数据库的索引、视图、触发器、游标和存储过程
- oracle创建表空间 10g导出数据库到 11g以及11g导入文件
- nginx+tomcat的ssl认证问题汇总
- 关于Unity游戏开发的MVC架构
- IOS中生成二维码、扫描二维码