java 解析xml的方式_Java中解析XML的方式有哪些

java解析XML的方式有使用DOM解析通过DOM对象以树状结构连接在一起;使用SAX 解析它是遇到不同元素时会逐行解析;使用StAX解析会从XML中提取所需的数据

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

25a8b21fbb8bbe2764bd71d0f8d65a18.png

【推荐课程: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 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 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 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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值