XML解析

作者: 低调的灬攻城狮 | 来源:发表于2020-04-14 12:37 被阅读0次

    一、XML解析

    • XML解析共有4种方式,分别是DOM,SAX,DOM4J,JDOM,以下只介绍DOM和DOM4J的两种方式

    二、DOM

    • 新建一个xml文件stus.xml:
      <students>
        <student>
            <sid>1</sid>
            <name>AAA</name>
            <addr>AA</addr>
        </student>
        <student>
            <sid>2</sid>
            <name>BBB</name>
            <addr>BB</addr>
        </student>
        <student>
            <sid>3</sid>
            <name>CCC</name>
            <addr>CC</addr>
        </student>
        <student>
            <sid>4</sid>
            <name>DDD</name>
            <addr>DD</addr>
        </student>
      </students>
      
    • 新增一个与xml匹配的pojo Student的类
      @Data
      public class Student {
          private int sid;
          private String name;
          private String addr;
      }
      
    • 新增类实现对于给定的xml进行解析
      public class TestStudent {
        public List<Student> parseXml(String xmlFile){
            List<Student> list = new ArrayList<>();
            //  1.  创建DocumentBuilderFactory对象
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            try {
                  //  2.  使用DocumentBuilderFactory对象的newDocumentBuilder()方法创建一个DocumentBuilder对象
                  DocumentBuilder builder = dbf.newDocumentBuilder();
                  //  3.  使用DocumentBuilder的parse(file)方法来对于指定文件来进行解析,得到一个document对象
                  Document document = builder.parse(xmlFile);
                  //  4.  通过document对象的getElementsByTagName(tagName)来获取指定标签的节点
                  NodeList nodeList = document.getElementsByTagName("student");
                  Student stu = null;
                  for (int i = 0; i < nodeList.getLength(); i++) {
                      stu = new Student();
                      Node node = nodeList.item(i);
                      NodeList nodes = node.getChildNodes();
                      //  遍历每个student节点中的每个sid,name,addr节点
                      for (int j = 0; j < nodes.getLength(); j++) {
                          Node item = nodes.item(j);
                          //System.out.println(item);
                          switch (item.getNodeName()){
                              case "sid":
                                  String ssid = item.getTextContent();
                                  int sid = ssid == null ? 0 : Integer.parseInt(ssid);
                                  stu.setSid(sid);
                                  break;
                              case "name":
                                  String name = item.getTextContent();
                                  stu.setName(name);
                                  break;
                              case "addr":
                                  String addr = item.getTextContent();
                                  stu.setAddr(addr);
                                  break;
                          }
                      }
                      list.add(stu);
                  }
                  //System.out.println(document);
              } catch (ParserConfigurationException e) {
                  e.printStackTrace();
              } catch (SAXException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
              return list;
          }
          @Test
          public void testParse(){
              System.out.println(parseXml("stus.xml"));
          }
      }
      
    • 运行结果:
      [Student(sid=1, name=AAA, addr=AA), 
      Student(sid=2, name=BBB, addr=BB), 
      Student(sid=3, name=CCC, addr=CC), 
      Student(sid=4, name=DDD, addr=DD)]
      

    三、DOM4J

    • 在pom文件中新增一个依赖
      <dependency>
          <groupId>dom4j</groupId>
          <artifactId>dom4j</artifactId>
          <version>1.6.1</version>
      </dependency>
      
    • 新增一个XML文件
      <students>
        <student>
            <sid>1</sid>
            <name>AAA</name>
            <addr>AA</addr>
        </student>
        <student>
            <sid>2</sid>
            <name>BBB</name>
            <addr>BB</addr>
        </student>
        <student>
            <sid>3</sid>
            <name>CCC</name>
            <addr>CC</addr>
        </student>
        <student>
            <sid>4</sid>
            <name>DDD</name>
            <addr>DD</addr>
        </student>
      </students>
      
    • Student.java
      @Data
      public class Student {
          private int sid;
          private String name;
          private String addr;
      }
      
    • TestStudentXMLDom4j.java
      public class TestStudentXMLDom4j {
          public List<Student> parseXml(String xmlFile){
              List<Student> list = new ArrayList<>();
              //  1.  创建SAXReader对象
              SAXReader reader = new SAXReader();
              try {
                  //  2.  使用SAXReader对象读取给定的xml文件得到一个Document对象
                  Document document = reader.read(xmlFile);
                  //  3.  通过Document对象的getRootElement()方法得到xml的跟节点元素
                  Element root = document.getRootElement();
                  //System.out.println(size());
                  //  4.  通过root("根元素")顺藤摸瓜找到所有的子元素节点
                  List<Element> elements = root.elements();
                  Student stu = null;
                  for (Element el : elements) {
                      List<Element> list2 = el.elements();
                      //System.out.println(list2);
                      stu = new Student();
                      for (Element e : list2) {
                          switch (e.getName()){
                              case "sid":
                                  String ssid = e.getText();
                                  int sid = ssid == null ? 0 : Integer.parseInt(ssid);
                                  stu.setSid(sid);
                                  break;
                              case "name":
                                  String name = e.getText();
                                  stu.setName(name);
                                  break;
                              case "addr":
                                  String addr = e.getText();
                                  stu.setAddr(addr);
                                  break;
                          }
                      }
                      list.add(stu);
                  }
              } catch (DocumentException e) {
                  e.printStackTrace();
              }
              return list;
          }
          @Test
          public void testParseXml(){
              System.out.println(parseXml("stus.xml"));
          }
      }
      
    • 运行结果
      [Student(sid=1, name=AAA, addr=AA), 
      Student(sid=2, name=BBB, addr=BB), 
      Student(sid=3, name=CCC, addr=CC), 
      Student(sid=4, name=DDD, addr=DD)]
      

    相关文章

      网友评论

          本文标题:XML解析

          本文链接:https://www.haomeiwen.com/subject/bkvzmhtx.html