• 技术文章 >后端开发 >XML/RSS教程

    Java中解析XML的方式有哪些

    清浅清浅2019-04-15 13:08:18原创4288
    java解析XML的方式有使用DOM解析通过DOM对象以树状结构连接在一起;使用SAX 解析它是遇到不同元素时会逐行解析;使用StAX解析会从XML中提取所需的数据

    XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。接下来将要在文章中为大家具体介绍在Java中解析XML的方式,具有一定的参考作用,希望对大家有所帮助

    【推荐课程:XML教程

    使用DOM解析

    DOM解析器主要用于在内存中使用XML作为对象图(树状结构) 也就是文档对象模型(DOM)。首先解析器遍历输入XML文件并创建与XML文件中的节点相对应的DOM对象。这些DOM对象以树状结构链接在一起。一旦解析器完成了解析过程,就会从中获得这个类似树的DOM对象结构。

    例:在所有代码示例中解析xml内容

    public class DOMParserDemo {
     
      public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory =
            DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document =
          builder.parse(
            ClassLoader.getSystemResourceAsStream("xml/employee.xml"));
        List<Employee> empList = new ArrayList<>();
        NodeList nodeList = document.getDocumentElement().getChildNodes();
        for (int i = 0; i < nodeList.getLength(); i++) {
          Node node = nodeList.item(i);
          if (node instanceof Element) {
            Employee emp = new Employee();
            emp.id = node.getAttributes().
                getNamedItem("id").getNodeValue();
            NodeList childNodes = node.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
              Node cNode = childNodes.item(j);
              if (cNode instanceof Element) {
                String content = cNode.getLastChild().
                    getTextContent().trim();
                switch (cNode.getNodeName()) {
                  case "firstName":
                    emp.firstName = content;
                    break;
                  case "lastName":
                    emp.lastName = content;
                    break;
                  case "location":
                    emp.location = content;
                    break;
                }
              }
            }
            empList.add(emp);
          }
        }
       
        for (Employee emp : empList) {
          System.out.println(emp);
        }
     
      }
    }
    class Employee{
      String id;
      String firstName;
      String lastName;
      String location;
     
      @Override
      public String toString() {
        return firstName+" "+lastName+"("+id+")"+location;
      }
    }

    输出结果为:

    Rakesh Mishra(111)Bangalore
    John Davis(112)Chennai
    Rajesh Sharma(113)Pune

    使用SAX 解析

    SAX Parser与DOM解析器的不同之处在于SAX解析器不会将完整的XML加载到内存中,而是在遇到不同的元素时,它逐行解析XML,c触发不同的事件,例如:打开标记,结束标记,字符数据,评论等。

    使用SAX Parser解析XML的代码如下:

    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    public class SAXParserDemo {
      public static void main(String[] args) throws Exception {
        SAXParserFactory parserFactor = SAXParserFactory.newInstance();
        SAXParser parser = parserFactor.newSAXParser();
        SAXHandler handler = new SAXHandler();
        parser.parse(ClassLoader.getSystemResourceAsStream("xml/employee.xml"),
                     handler);
        for ( Employee emp : handler.empList){
          System.out.println(emp);
        }
      }
    }
    class SAXHandler extends DefaultHandler {
     
      List<Employee> empList = new ArrayList<>();
      Employee emp = null;
      String content = null;
      @Override
      public void startElement(String uri, String localName,
                               String qName, Attributes attributes)
                               throws SAXException {
           
        switch(qName){
          case "employee":
            emp = new Employee();
            emp.id = attributes.getValue("id");
            break;
        }
      }
     
      @Override
      public void endElement(String uri, String localName,
                             String qName) throws SAXException {
       switch(qName){
         case "employee":
           empList.add(emp);      
           break;
         case "firstName":
           emp.firstName = content;
           break;
         case "lastName":
           emp.lastName = content;
           break;
         case "location":
           emp.location = content;
           break;
       }
      }
     
      @Override
      public void characters(char[] ch, int start, int length)
              throws SAXException {
        content = String.copyValueOf(ch, start, length).trim();
      }
         
    }
     
    class Employee {
      String id;
      String firstName;
      String lastName;
      String location;
     
      @Override
      public String toString() {
        return firstName + " " + lastName + "(" + id + ")" + location;
      }
    }

    输出结果为:

    Rakesh Mishra(111)Bangalore
    John Davis(112)Chennai
    Rajesh Sharma(113)Pune

    使用StAX Parser

    StAX用于XML的Streaming API,而StAX Parser与SA的不同之处在于SAX Parser。StAX解析器也是一种与SAX解析器也是有所不同的

    SAX Parser会推送数据,但StAX解析器会从XML中提取所需的数据。StAX解析器将光标维持在文档中的当前位置,允许提取光标处可用的内容,而SAX解析器在遇到某些数据时发出事件。

    XMLInputFactory和XMLStreamReader是可用于加载XML文件的两个类。当我们使用XMLStreamReader读取XML文件时,事件以整数值的形式生成,然后将这些事件与XMLStreamConstants中的常量进行比较。以下代码显示了如何使用StAX解析器解析XML:

    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.stream.XMLInputFactory;
    import javax.xml.stream.XMLStreamConstants;
    import javax.xml.stream.XMLStreamException;
    import javax.xml.stream.XMLStreamReader;
     
    public class StaxParserDemo {
      public static void main(String[] args) throws XMLStreamException {
        List<Employee> empList = null;
        Employee currEmp = null;
        String tagContent = null;
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader reader =
            factory.createXMLStreamReader(
            ClassLoader.getSystemResourceAsStream("xml/employee.xml"));
             
        while(reader.hasNext()){
          int event = reader.next();
          switch(event){
            case XMLStreamConstants.START_ELEMENT:
              if ("employee".equals(reader.getLocalName())){
                currEmp = new Employee();
                currEmp.id = reader.getAttributeValue(0);
              }
              if("employees".equals(reader.getLocalName())){
                empList = new ArrayList<>();
              }
              break;
               
            case XMLStreamConstants.CHARACTERS:
              tagContent = reader.getText().trim();
              break;
               
            case XMLStreamConstants.END_ELEMENT:
              switch(reader.getLocalName()){
                case "employee":
                  empList.add(currEmp);
                  break;
                case "firstName":
                  currEmp.firstName = tagContent;
                  break;
                case "lastName":
                  currEmp.lastName = tagContent;
                  break;
                case "location":
                  currEmp.location = tagContent;
                  break;
              }
              break;
            case XMLStreamConstants.START_DOCUMENT:
              empList = new ArrayList<>();
              break;
          }
     
        }
        for ( Employee emp : empList){
          System.out.println(emp);
        }
           
      }
    }
     
    class Employee{
      String id;
      String firstName;
      String lastName;
      String location;
       
      @Override
      public String toString(){
        return firstName+" "+lastName+"("+id+") "+location;
      }
    }

    输出结果为:

    Rakesh Mishra(111) Bangalore
    John Davis(112) Chennai
    Rajesh Sharma(113) Pune

    总结:以上就是本篇文章的全部内容了,希望对大家有所帮助

    以上就是Java中解析XML的方式有哪些的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java 解析XML
    上一篇:XML是什么,有什么作用 下一篇:XML的解析与创建范例
    Web大前端开发直播班

    相关文章推荐

    • 用Java解析XML文件的代码示例• 解析XML的四种方法• js解析xml实例分享

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网