zoukankan      html  css  js  c++  java
  • 9.XML文件解析

    一.XML简介

    XML(EXtensible Markup Language),可扩展标记语言

    特点:XML与操作系统、编程语言的开发平台无关 实现不同系统之间的数据交换

    作用:数据交互 配置应用程序和网站 Ajax基石

    二.XML标签

    XML文档内容由一系列标签元素组成

    语法:

    (1)属性值用双引号包裹

    (2)一个元素可以有多个属性

    (3)属性值中不能直接包含<、“、&(不建议:‘、>)

    三.XML编写注意事项

    标签编写注意事项

    (1)所有XML元素都必须有结束标签

    (2)XML标签对大小写敏感

    (3)XML必须正确的嵌套

    (4)同级标签以缩进对齐

    (5)元素名称可以包含字母、数字或其他的字符

    (6)元素名称不能以数字或者标点符号开始

    (7)元素名称中不能含空格

    四.转义符

    XML中的转义符列表

    当元素中出现很多特殊字符时,可以使用CDATA节,如: <description> <![CDATA[讲解了元素<title>以及</title>的使用]]> </description>

     五.XML解析器

    解析器类型

    (1)非验证解析器:检查文档格式是否良好

    (2)验证解析器:使用DTD检查文档的有效性

    六.解析XML技术

    七.xml文件的引入

    7.1 创建Student.java类

     1 package com.entity;
     2 /**
     3  * 1.创建学生类
     4  * @author pc
     5  *
     6  */
     7 public class Student {
     8     private int id;
     9     private String name;
    10     private String course;
    11     private int score;
    12     
    13     public Student() {
    14     }
    15     public Student(int id, String name, String course, int score) {
    16         this.id = id;
    17         this.name = name;
    18         this.course = course;
    19         this.score = score;
    20     }
    21     public int getId() {
    22         return id;
    23     }
    24     public void setId(int id) {
    25         this.id = id;
    26     }
    27     public String getName() {
    28         return name;
    29     }
    30     public void setName(String name) {
    31         this.name = name;
    32     }
    33     public String getCourse() {
    34         return course;
    35     }
    36     public void setCourse(String course) {
    37         this.course = course;
    38     }
    39     public int getScore() {
    40         return score;
    41     }
    42     public void setScore(int score) {
    43         this.score = score;
    44     }
    45     @Override
    46     public String toString() {
    47         return "Student [course=" + course + ", id=" + id + ", name=" + name
    48                 + ", score=" + score + "]";
    49     }
    50     
    51     
    52 
    53 }
    Student.java

    7.2 创建测试类Test.java

     1 package com.entity;
     2 
     3 public class Test {
     4 
     5     /**
     6      * @param args
     7      */
     8     public static void main(String[] args) {
     9       Student mengmeng=new Student(1, "许萌", "java", 98);
    10       Student zhangfujun=new Student(2, "张福军", "java", 98);
    11      System.out.println(mengmeng);
    12      System.out.println(zhangfujun);
    13     }
    14 
    15 }
    Test.java

    7.3 对象映射到xml文件Student.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <students>
     3   <student id="1">
     4     <name>许萌</name>
     5     <course>java</course>
     6     <score>98</score>
     7   </student>
     8   <student id="2">
     9     <name>张福军</name>
    10     <course>mysql</course>
    11     <score>98</score>
    12   </student>
    13 </students>
    Student.xml

    八.DtD的创建

    (1)声明DTD:<!DOCTYPE 根元素 [定义内容]>
    (2)定义dtd元素标签节点:<!ELEMENT 标签名 元素类型> 
    (3)定义dtd元素标签属性:<!ATTLIST 元素名称 属性名称 属性类型 属性默认值>
    (4)ELEMENT 定义标签节点
    (5)ATTLIST 定义标签属性
    (6)PCDATA 表示属性类型是字符数据
    (7)#REQUIRED 属性值是必须的
    (8)#IMPLIED 属性值不是必须的
    (9)#FIXED 属性值是固定的
    (10)(|)给元素分组
    (11)A|B 必须选择A或B
    (12)A,B 表示A和B按照顺序出现
    (13)A* 表示A出现0到n次
    (14)A? 表示A出现0到1次
    (15)A+ 表示A出现一次或n次
    

    8.1 案例:创建school.xml文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE 学校[
     3 <!ELEMENT 学校 (班级+)>
     4 <!ELEMENT 班级 (名称?,教师+)>
     5 <!ELEMENT 名称 (#PCDATA)> 
     6 <!ELEMENT 教师 (#PCDATA)> 
     7 ]>
     8 <学校>
     9   <班级>
    10      <名称>淘宝31</名称>
    11      <教师>徐娟</教师>
    12      <教师>Holly</教师>
    13   </班级>
    14 </学校>
    school.xml

    九.DOM解析xml文件

    9.1 案例使用DOM读取xml文件

    9.1.1 在项目根目录下创建book.xml

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <books>
    3     <book id="bk1001">
    4         <title>三国演义</title>
    5         <author>罗贯中</author>
    6         <price>30元</price>
    7     </book>
    8 </books>
    book.xml

    9.1.2 在com.dom包下下创建DomTest.java

     1 package com.dom;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.xml.parsers.DocumentBuilder;
     6 import javax.xml.parsers.DocumentBuilderFactory;
     7 import javax.xml.parsers.ParserConfigurationException;
     8 
     9 import org.w3c.dom.Document;
    10 import org.w3c.dom.Node;
    11 import org.w3c.dom.NodeList;
    12 import org.xml.sax.SAXException;
    13 
    14 /**
    15  * 1.使用dom读取xml文件=解析xml文件
    16  * @author pc
    17  *
    18  */
    19 public class DomTest {
    20     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
    21         //1.得到DOM解析器工厂实例
    22         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
    23         //2.从DOM解析器工厂获取DOM解析器
    24         DocumentBuilder db=dbf.newDocumentBuilder();
    25         //3.读取book.xml文件,转换DOM树(book.xml文件必须放在项目根目录下)
    26         Document doc=db.parse("book.xml");
    27         //4.从DOM树中获取所有根节点列表
    28         NodeList allbooks=doc.getChildNodes();
    29         //5.获取图书节点books
    30         Node booksNode=allbooks.item(0);
    31         //6.获取的books图书节点下的所有子节点列表book
    32         NodeList books=booksNode.getChildNodes();
    33         //7.循环遍历子节点列表信息
    34         for (int i = 0; i < books.getLength(); i++) {
    35             //7.1获取第i个book节点元素
    36             Node book =books.item(i);
    37             //7.2获取book节点下的所有元素节点
    38             NodeList items=book.getChildNodes();
    39             //7.3循环遍历book节点下的所有元素节点
    40             for (int j = 0; j < items.getLength(); j++) {
    41                 //7.3.1 获取book节点下的某个元素节点
    42                 Node node=items.item(j);
    43                 //7.3.2 获取元素节点的名称
    44                 String nodeName=node.getNodeName();
    45                 //7.3.3 获取元素节点的内容
    46                 String nodeConent=node.getTextContent();
    47                 //7.3.4判断节点名称获取对应的节点内容
    48                 if(nodeName.equals("title")){
    49                     System.out.println("书名:"+nodeConent);
    50                 }else if(nodeName.equals("author")){
    51                     System.out.println("作者:"+nodeConent);
    52                 }else if(nodeName.equals("price")){
    53                     System.out.println("价格:"+nodeConent);
    54                 }
    55                 
    56             }
    57             
    58         }
    59         
    60         
    61     }
    62 
    63 }
    DomTest.java

    9.2 案例使用DOM对xml文件增删改查

    9.2.1 在项目根目录下创建student.xml

     1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     2 <students>
     3     <student id="1">
     4         <name>许萌</name>
     5         <course>java</course>
     6         <score>98</score>
     7     </student>
     8     <student id="2">
     9         <name>张福军</name>
    10         <course>mysql</course>
    11         <score>98</score>
    12     </student>
    13 </students>
    Student.xml

    9.2.2 在com.dom包下下创建DomTest2.java

      1 package com.dom;
      2 
      3 import java.io.FileOutputStream;
      4 import java.io.IOException;
      5 
      6 import javax.print.Doc;
      7 import javax.xml.parsers.DocumentBuilder;
      8 import javax.xml.parsers.DocumentBuilderFactory;
      9 import javax.xml.parsers.ParserConfigurationException;
     10 import javax.xml.transform.OutputKeys;
     11 import javax.xml.transform.Transformer;
     12 import javax.xml.transform.TransformerConfigurationException;
     13 import javax.xml.transform.TransformerException;
     14 import javax.xml.transform.TransformerFactory;
     15 import javax.xml.transform.dom.DOMSource;
     16 import javax.xml.transform.stream.StreamResult;
     17 
     18 import org.w3c.dom.Document;
     19 import org.w3c.dom.Element;
     20 import org.w3c.dom.Node;
     21 import org.w3c.dom.NodeList;
     22 import org.xml.sax.SAXException;
     23 
     24 /**
     25  * dom4j对xml文件全套增删改查
     26  * 
     27  * @author pc
     28  * 
     29  */
     30 public class DomTest2 {
     31     public static void main(String[] args) throws ParserConfigurationException,
     32             SAXException, IOException, TransformerException {
     33         //add();
     34         update();
     35         delete();
     36         select();
     37 
     38     }
     39 
     40     private static void select() throws ParserConfigurationException,
     41             SAXException, IOException {
     42         // 1.创建dom解析器工厂
     43         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     44         // 2.从dom工厂获取DOM解析器
     45         DocumentBuilder db = dbf.newDocumentBuilder();
     46         // 3.读取student.xml文件,转换为DOM数,该文在必须在项目根目录
     47         Document doc = db.parse("Student.xml");
     48         // 4.从DOM中获取所有根节点列表students
     49         NodeList studentsList = doc.getChildNodes();
     50         // 5.获取第一个根节点studens
     51         Node studentsNode = studentsList.item(0);
     52         // 6.从第一个根节点下获取所有的student子节点列表
     53         NodeList studentList = studentsNode.getChildNodes();
     54         // 7.循环遍历student子节点
     55         for (int i = 0; i < studentList.getLength(); i++) {
     56             // 7.1 获取某个student节点
     57             Node student = studentList.item(i);
     58             // 7.2 获取student节点下所有元素节点列表(name,course,score)
     59             NodeList items = student.getChildNodes();
     60             // 7.3 循环student节点下的所有元素节点
     61             for (int j = 0; j < items.getLength(); j++) {
     62                 // 7.3.1 获取某个元素节点(name,course,score)
     63                 Node node = items.item(j);
     64                 // 7.3.2 获取某个元素节点名称
     65                 String nodeName = node.getNodeName();
     66                 // 7.3.3 获取某个元素节点的内容
     67                 String nodeContent = node.getTextContent();
     68                 // 7.3.4 判断根据元素节点名称获取对应元素节点内容
     69                 if (nodeName.equals("name")) {
     70                     System.out.println("姓名:" + nodeContent);
     71                 } else if (nodeName.equals("course")) {
     72                     System.out.println("课程:" + nodeContent);
     73                 } else if (nodeName.equals("score")) {
     74                     System.out.println("成绩:" + nodeContent);
     75                 }
     76             }
     77 
     78         }
     79 
     80     }
     81 
     82     private static void add() throws ParserConfigurationException,
     83             SAXException, IOException, TransformerException {
     84         // 1.创建dom解析器工厂
     85         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     86         // 2.从dom工厂获取DOM解析器
     87         DocumentBuilder db = dbf.newDocumentBuilder();
     88         // 3.读取student.xml文件,转换为DOM数,该文在必须在项目根目录
     89         Document doc = db.parse("Student.xml");
     90         // 4.创建Student节点
     91         Element studentElement = doc.createElement("student");
     92         // 5.为Student节点设置属性
     93         studentElement.setAttribute("id", "3");
     94         // 6.创建name元素节点
     95         Element nameElement = doc.createElement("name");
     96         // 7.为name元素节点添加内容
     97         nameElement.setTextContent("陈金锋");
     98         // 8.将name元素节点放入Student节点
     99         studentElement.appendChild(nameElement);
    100         // 9.创建course元素节点
    101         Element courseElement=doc.createElement("course");
    102         // 10.为course元素节点添加内容
    103         courseElement.setTextContent("JSP");
    104         // 11.将course元素节点添加到Student节点内
    105         studentElement.appendChild(courseElement);
    106         // 12.创建score元素节点
    107         Element scoreElement=doc.createElement("score");
    108         // 13.为score元素节点添加内容
    109         scoreElement.setTextContent("90");
    110         // 14.将score元素节点添加到Student节点内
    111         studentElement.appendChild(scoreElement);
    112         // 15.获取Students根节点(根据节点名获取整个节点)
    113         Element studentsElement=(Element) doc.getElementsByTagName("students").item(0);
    114         // 16.将student节点放入Students根节点中
    115         studentsElement.appendChild(studentElement);
    116         // 17.创建添加节点工厂对象
    117         TransformerFactory transformerFactory=TransformerFactory.newInstance();
    118         // 18.根据添加节点工厂对象创建添加节点对象
    119         Transformer transformer=transformerFactory.newTransformer();
    120         // 19.将整个节点放入内存
    121         DOMSource domSource=new DOMSource(doc);
    122         // 20.设置编码类型
    123         transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    124         // 21.创建输出流对象,并执行写入路径
    125         StreamResult result=new StreamResult(new FileOutputStream("Student.xml"));
    126         // 22.添加节点对象将内存中dom写入文件
    127         transformer.transform(domSource, result);
    128         System.out.println("添加成功!!");
    129     }
    130 
    131     private static void update() throws ParserConfigurationException, SAXException, IOException, TransformerException {
    132         //1.获取dom解析器工厂对象
    133         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
    134         //2.从DOM解析器工厂获取dom解析器
    135         DocumentBuilder db=dbf.newDocumentBuilder();
    136         //3.读取Student.xml,生成DOM树
    137         Document doc=db.parse("Student.xml");
    138         //4.找到修改的节点所在集合
    139         NodeList studentList=doc.getElementsByTagName("student");
    140         //5.循环遍历修改节点所在集合
    141         for (int i = 0; i < studentList.getLength(); i++) {
    142             //5.1.获取某个student节点
    143             Element studentElement=(Element) studentList.item(i);
    144             //5.2 获取Student节点的id属性值
    145             String studentId=studentElement.getAttribute("id");
    146             //5.3判断Student节点的id值是否是要修改的id为3的节点
    147             if(studentId.equals("3")){
    148                 //5.3.1 获取修改的Student节点下的Score元素节点
    149                Element scoreElement=(Element) studentElement
    150                .getElementsByTagName("score").item(0);
    151                 //5.3.2  修改score节点文本内容
    152                scoreElement.setTextContent("60");
    153                System.out.println("update is success!");
    154             }
    155         }
    156         //6.创建添加节点工厂对象
    157         TransformerFactory transformerFactory=TransformerFactory.newInstance();
    158         //7.根据添加节点工厂对象创建添加节点对象
    159         Transformer transformer=transformerFactory.newTransformer();
    160         //8.将dom放入内存中
    161         DOMSource domSource=new DOMSource(doc);
    162         //9.设置编码类型
    163         transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    164         //10.创建输出流并指定写入路径
    165         StreamResult result=new StreamResult(new FileOutputStream("Student.xml"));
    166         //11.根据添加节点对象将内存中dom树,写入xml文件
    167         transformer.transform(domSource, result);
    168     }
    169 
    170     private static void delete() throws ParserConfigurationException, SAXException, IOException, TransformerException {
    171         //1.创建dom解析器工厂
    172         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
    173         //2.根据dom解析器工厂创建dom解析器
    174         DocumentBuilder db=dbf.newDocumentBuilder();
    175         //3.读取xml文件,并生成dom树
    176         Document doc=db.parse("Student.xml");
    177         //4.找到所有的student节点集合
    178         NodeList studentList=doc.getElementsByTagName("student");
    179         //5.循环找出要删除的student节点
    180         for (int i = 0; i < studentList.getLength(); i++) {
    181             //5.1 获取某个student节点
    182             Element studentElement=(Element) studentList.item(i);
    183             //5.2 获取某个student节点的id属性
    184             String studentid=studentElement.getAttribute("id");
    185             //5.3 判断id属性值是否是我们要找的id值
    186             if(studentid.equals("3")){
    187                 //5.3.1 删除student的id为某个值的整个student节点
    188                 studentElement.getParentNode()
    189                 .removeChild(studentElement);
    190                 System.out.println("delete is success!!");
    191             }
    192             
    193         }
    194         //6.创建添加节点工厂对象
    195         TransformerFactory transformerFactory=TransformerFactory.newInstance();
    196         //7.根据添加节点工厂对象创建添加节点对象
    197         Transformer transformer=transformerFactory.newTransformer();
    198         //8.将dom放入内存中
    199         DOMSource domSource=new DOMSource(doc);
    200         //9.设置编码类型
    201         transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    202         //10.创建输出流并指定写入路径
    203         StreamResult result=new StreamResult(new FileOutputStream("Student.xml"));
    204         //11.根据添加节点对象将内存中dom树,写入xml文件
    205         transformer.transform(domSource, result);
    206 
    207     }
    208 
    209 }
    DomTest2.java

    十.使用DOM4j操作xml文件

    10.1.2 在com.dom4j包下下创建DOM4jParse.java

     1 package com.dom4j;
     2 
     3 import java.io.File;
     4 import java.util.HashMap;
     5 import java.util.Iterator;
     6 
     7 import org.dom4j.Document;
     8 import org.dom4j.DocumentException;
     9 import org.dom4j.Element;
    10 import org.dom4j.io.SAXReader;
    11 
    12 /**
    13  * 使用DOM4j解析xml文件
    14  * @author Holly老师
    15  *
    16  */
    17 public class DOM4jParse {
    18     public static void main(String[] args) throws DocumentException {
    19         //1.创建HashMap集合,存放解析后的内容
    20         HashMap<String, String> hashMap=new HashMap<String, String>(); 
    21         //2.获取xml文件所在的路径(System.getProperty("user.dir")=项目真实路径)
    22         String xmlPath=System.getProperty("user.dir")+"\Student.xml";
    23         /*3.解析xml文件内容到map集合
    24         *(参数分为输入参数和输出参数,)
    25         *输入参数可以是任意类型,
    26         *输出参数只能是引用类型
    27         */
    28         dom4jParseXml(xmlPath,hashMap);
    29         //4.循环遍历map集合打印内容
    30         for (int i = 0; i < hashMap.size(); i+=3) {
    31             int j=i/3; //第一个student节点
    32             System.out.print(hashMap.get("name"+j)+"	");
    33             System.out.print(hashMap.get("course"+j)+"	");
    34             System.out.println(hashMap.get("score"+j)+"	");
    35         }
    36         
    37     }
    38    /**
    39     * 
    40     * @param xmlPath xml文件路径
    41     * @param hashMap
    42  * @throws DocumentException 
    43     */
    44     private static void dom4jParseXml(String xmlPath,
    45             HashMap<String, String> hashMap) throws DocumentException {
    46         //1.创建读取xml文件的对象(xml输入流对象)
    47         SAXReader saxReader=new SAXReader();
    48         //2.创建文件流指定读取路径
    49         File file=new File(xmlPath);
    50         //3.在指定路径中读取xml文件并转换为dom树
    51         Document document =saxReader.read(file);
    52         //4.获取xml文档的根节点
    53         Element root=document.getRootElement();
    54         //5.定义用于记录学生编号的变量
    55         int num=-1;
    56         //6.获取根元素students下的所有的student放入迭代器集合
    57         Iterator studentList=root.elementIterator();
    58         //7.循环student标签集合
    59         while(studentList.hasNext()){
    60             //获取某个student节点标签
    61             Element studentElement=(Element) studentList.next();
    62             num++;
    63             //获取student标签下的所有元素节点的集合
    64             Iterator studentContentList=studentElement.elementIterator();
    65             //循环获取student标签下元素节点内容
    66             while(studentContentList.hasNext()){
    67                 //获取student标签下的某个元素节点
    68                 Element studentContent=(Element) studentContentList.next();
    69                 //循环将读取到的元素节点内容放入hashmap中(getName()获取标签名,getText()标签文本内容)
    70                 hashMap.put(studentContent.getName()+num, studentContent.getText());
    71             }
    72         }
    73         
    74     }
    75 
    76 }
    DOM4jParse.java
  • 相关阅读:
    2018-2019-2 20165313 《网络对抗技术》Exp4 恶意代码分析
    2018-2019-2 20165313 Exp3 免杀原理与实践
    2018-2019-2 20165313 Exp2 后门原理与实践
    linux安装firmware-mod-kit
    暑假BUUCTF抄题记录
    手动编译Aseprite v1.2.21
    GameMaker Studio2 疑难杂症
    20181218 实验四《Python程序设计》实验报告
    20181218 实验三《Python程序设计》实验报告
    Mysql各种问题
  • 原文地址:https://www.cnblogs.com/holly8/p/6149199.html
Copyright © 2011-2022 走看看