xml解析方式分为两种,dom和sax
dom:(Document Object Model,即对文档对象模型)是W3C组织推荐的处理XML的一种方式
Sax:(Simple API for XML)不是官方标准,但它是xml社区事实上的标准,几乎所有的xml解析器都支持它。
XML解析开发包
Jaxp、Jdom、dom4J
使用DOM解析XML介绍
DOM模型(Document Object model)
DOM 解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
优点:把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点:如果文件比较大,内存有压力,解析的实际那会比较长
使用Dom解析XML的步骤
调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
调用工厂对象的newDocumentBuilder方法得到DOM解析器对象。
DocumentBuilder builder = dbf.newDocumentBuilder();
调用Dom解析器对象的parse()方法解析XML文档,得到代表这个文档的Document对象,进行可以利用DOM特性对整个XML文档进行操作了。
Document doc = builder.parse("src/com/demo.xml");//此处填写需要解析的XML的路径
总结:先反射一个解析工厂对象,再通过这个解析工厂对象创建一个Dom解析器对象,再通过Dom解析器对象获得doc文档对象。
Dom解析XML实例
(1)给出需要解析的XML文件
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee id="0">
<name>Alexia</name>
<age>23</age>
<sex>Female</sex>
<weight> 150 </weight>
<weight><a>160</a></weight>
</employee>
<employee id="1">
<name height="178">Edward</name>
<age>24</age>
<sex>Male</sex>
</employee>
<employee id="2">
<name>wjm</name>
<age>23</age>
<sex>Female</sex>
</employee>
<employee id="3">
<name>wh</name>
<age>24</age>
<sex>Male</sex>
</employee>
</employees>
(2)使用Dom对XML进行解析
package com.demo;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Domxml {
/*
*类说明:
* 使用Dom解析XMl
*Dom解析XMl的步骤:
* 1:创建一个dbf工厂对象的对象。
* 2:通过dbf工厂对象创建一个dom解析器DocumentBuilder对象。
* 3:通过DocumentBuilder对象的parse(String fileName)方法解析xml文件
*
*/
public static void main(String[] args) throws Exception{
//1.创建【dbf工厂对象】
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//设置解析器,忽略注释和空格<a>
dbf.setIgnoringComments(true);
dbf.setIgnoringElementContentWhitespace(true);
//2.通过dbf工厂对象获得【Dom解析对象】
DocumentBuilder builder = dbf.newDocumentBuilder();
//3。调用DOm解析器对象,解析xml文档,获得[文档Document对象]
Document doc = builder.parse("src/conn/demo.xml");//此处填需要解析的xml的路径
//获得根节点
Element root = doc.getDocumentElement();
System.out.println(root.getTagName());//获得节点名字
//根据标签名获得节点集合
NodeList nodeList = doc.getElementsByTagName("employee");
System.out.println("employee节点个数:" + nodeList.getLength());
//遍历节点集合
for(int i = 0;i<nodeList.getLength();i++){
Element element = (Element) nodeList.item(i);//强制转换
//获取id属性值
String attribute = element.getAttribute("id");
System.out.println("id:"+attribute);
//获取第一个employee
if(i==0){
//获得元素下面的name文本
System.out.println("name文本值为: "+element.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
//获得元素下面的sex文本
System.out.println("sex文本值: "+element.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue());
//获得元素下面的 age文本
System.out.println("age文本值: "+element.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());
//获得元素下面的 weight文本
System.out.println("weight文本值: "+element.getElementsByTagName("weight").item(0).getFirstChild().getNodeValue());
// 获得第二个Weight里a标签中的文本值
System.out.println(element.getElementsByTagName("weight").item(1).getFirstChild().getFirstChild().getNodeValue());
}
System.out.println("");
System.out.println("");
System.out.println("");
System.out.println("");
// System.out.println("name文本值为: "+element.getElementsByTagName("name").item(i).getFirstChild().getNodeValue());
// //获得元素下面的age文本
// System.out.println("sex文本值: "+element.getElementsByTagName("sex").item(i).getFirstChild().getNodeValue());
// //获得元素下面的 文本
// System.out.println("age文本值: "+element.getElementsByTagName("age").item(i).getFirstChild().getNodeValue());
//
// Element element2 = (Element)nodeList.item(1);
// String nameValue2 = element2.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
// String ageValue2 = element2.getElementsByTagName("age").item(0).getFirstChild().getNodeValue();
// String sexValue2 = element2.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue();
// System.out.println("第二个节点的name文本值:"+nameValue2);
// System.out.println("第二个节点的age文本值:"+ageValue2);
// System.out.println("第二个节点的sex文本值:"+sexValue2);
}
}
}
得到结果如下:
使用SAX解析XML介绍
SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会对文档当进行处理。
优点:解析可以立即开始,速度快,没有内存压力
缺点:不能对节点做修改
使用SAX解析XML步骤
使用Sax解析XML的准备工作:
1.继承DefaultHandler类:这是解析XML的事件处理基类
2.覆盖statDocument
/endDocument
,startElement
/endElement
方法
使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
通过SAX解析工厂得到解析器对象
SAXParser saxParse = spf.newSAXParser();
通过解析器对象得到一个XML的读取器
XMLRead xmlReader = sp.getXMLReader();
设置读取器的事件处理器
xmlReader.setContentHandler(new BookParserHandler());
解析xml文件
File file = new File("src/com/demo.xml");
saxParse.parse(file, new SaxXML());//第二个参数为类名
代码如下:
package com.demo;
import java.io.File;
import javax.xml.parsers.ParserConfigurationException;
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 SaxXml extends DefaultHandler {
//在解析整个文档开始时调用
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("开始文档! ");
}
//在解析整个文档结束时调用
public void endDocument() throws SAXException{
System.out.println("结束文档! ");
}
//在解析元素开始时被调用
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("开始解析元素*************************"+qName);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
System.out.println("结束文档!");
}
public static void main(String[] args) throws Exception, SAXException {
//1 发射一个Sax解析工厂对象
SAXParserFactory spf = SAXParserFactory.newInstance();
//2 创建Sax解析器对象
SAXParser saxParser = spf.newSAXParser();
//3 解析xml文件
File file = new File("src/conn/demo.xml");
//4.解析XML文件
saxParser.parse(file,new SaxXml());
}
}
运行结果:
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/114773.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...