Java中解析XML的方式有哪些

互联网 19-4-15
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的方式有哪些的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 解析XML
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:XML是什么,有什么作用

相关资讯