JAXP:是sun公司开发的一套对xml的解析
它由javax.xml.parsers 、org.w3c.dom 、org.xml.sax包及其子包组成
JAXP有2种解析方式:
一、dom解析:将文档读取进内存,生产Document对象
二、sax解析:从上往下读,读取一行处理一行
dom优点:对文档CRUD方便
缺点:内存消耗大
sax优点:内存消耗小,解析速度快、适合读取文档
缺点:CUD不方便
实例xml文档
- <?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
- <书>
- <书名 id="1234">.Net</书名>
- <作者>wht</作者>
- </书>
- <书>
- <书名>javaEE</书名>
- <作者>www</作者>
- </书>
- </书架>
dom解析步骤
- 创建dom工厂 DocumentBuilderFactory
- 得到dom解析器 DocumentBuilder
- 读取xml文档,得到 Document
- package Jaxp.dom;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.transform.Transformer;
- import javax.xml.transform.TransformerFactory;
- import javax.xml.transform.dom.DOMSource;
- import javax.xml.transform.stream.StreamResult;
- import org.junit.Test;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- public class Dom {
- //读取文档中的一个指定标签
- @Test
- public void read1() throws Exception{
- //1、创建dom工厂
- DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
- //2、创建解析器
- DocumentBuilder builder=factory.newDocumentBuilder();
- //3、读取xml文件 产生Document对象
- Document document=builder.parse("src/book.xml");
- Node node=document.getElementsByTagName("书").item(0);
- System.out.println(node.getNodeName());
- }
- //读取整个文档的标签
- @Test
- public void read2() throws Exception{
- //1、创建dom工厂
- DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
- //2、创建解析器
- DocumentBuilder builder=factory.newDocumentBuilder();
- //3、读取xml文件 产生Document对象
- Document document=builder.parse("src/book.xml");
- Node root=document.getElementsByTagName("书架").item(0);
- list(root);
- }
- private void list(Node node) {
- // TODO Auto-generated method stub
- System.out.println(node.getNodeName());
- NodeList nodes=node.getChildNodes();
- for(int i=0;i<nodes.getLength();i++){
- Node node1=nodes.item(i);
- list(node1);
- }
- }
- //添加一个标签
- @Test
- public void add() throws Exception{
- //1、创建dom工厂
- DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
- //2、创建解析器
- DocumentBuilder builder=factory.newDocumentBuilder();
- //3、读取xml文件 产生Document对象
- Document document=builder.parse("src/book.xml");
- Element element=document.createElement("售价");
- element.setTextContent("55元");
- Element book=(Element) document.getElementsByTagName("书").item(0);
- book.appendChild(element);
- TransformerFactory tFactory=TransformerFactory.newInstance();
- Transformer transformer=tFactory.newTransformer();
- transformer.transform(new DOMSource(document),new StreamResult("src/book.xml"));
- }
- //删除一个标签
- @Test
- public void delete() throws Exception{
- //1、创建dom工厂
- DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
- //2、创建解析器
- DocumentBuilder builder=factory.newDocumentBuilder();
- //3、读取xml文件 产生Document对象
- Document document=builder.parse("src/book.xml");
- Element book=(Element) document.getElementsByTagName("书").item(0);
- book.removeChild(document.getElementsByTagName("售价").item(0));
- TransformerFactory tFactory=TransformerFactory.newInstance();
- Transformer transformer=tFactory.newTransformer();
- transformer.transform(new DOMSource(document),new StreamResult("src/book.xml"));
- }
- }
- 创建sax工厂 SAXParserFactory
- 得到sax解析器 SAXParser
- 得到读取器 XMLReader
- 设置内容处理处理器 reader.setContentHandler()
- 读取xml文档
- package Jaxp.sax;
- import java.io.IOException;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.Attributes;
- import org.xml.sax.ContentHandler;
- import org.xml.sax.Locator;
- import org.xml.sax.SAXException;
- import org.xml.sax.XMLReader;
- public class Demo {
- public static void main(String[] args) throws ParserConfigurationException,SAXException,IOException {
- //1、创建sax工厂
- SAXParserFactory factory=SAXParserFactory.newInstance();
- //2、得到解析器
- SAXParser saxParser=factory.newSAXParser();
- //3、得到读取器
- XMLReader reader=saxParser.getXMLReader();
- //4、设置内容处理器
- reader.setContentHandler(new XMLHandler());
- //5、读取xml文档
- reader.parse("src/book.xml");
- }
- }
- class XMLHandler implements ContentHandler{
- @Override
- public void startElement(String uri,String localName,String qName,Attributes atts) throws SAXException {
- // TODO Auto-generated method stub
- System.out.println("<"+qName+">");
- for(int i=0;i<atts.getLength();i++){
- System.out.println(atts.getQName(i));
- System.out.println(atts.getValue(i));
- }
- }
- @Override
- public void endElement(String uri,String qName)
- throws SAXException {
- // TODO Auto-generated method stub
- System.out.println("</"+qName+">");
- }
- @Override
- public void characters(char[] ch,int start,int length)
- throws SAXException {
- // TODO Auto-generated method stub
- System.out.println(new String(ch,start,length));
- }
- @Override
- public void setDocumentLocator(Locator locator) {
- // TODO Auto-generated method stub
- }
- @Override
- public void startDocument() throws SAXException {
- // TODO Auto-generated method stub
- }
- @Override
- public void endDocument() throws SAXException {
- // TODO Auto-generated method stub
- }
- @Override
- public void startPrefixMapping(String prefix,String uri)
- throws SAXException {
- // TODO Auto-generated method stub
- }
- @Override
- public void endPrefixMapping(String prefix) throws SAXException {
- // TODO Auto-generated method stub
- }
- @Override
- public void ignorableWhitespace(char[] ch,int length)
- throws SAXException {
- // TODO Auto-generated method stub
- }
- @Override
- public void processingInstruction(String target,String data)
- throws SAXException {
- // TODO Auto-generated method stub
- }
- @Override
- public void skippedEntity(String name) throws SAXException {
- // TODO Auto-generated method stub
- }
- }
sun公司提供了DefaultHandler
- package Jaxp.sax;
- import java.io.IOException;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.Attributes;
- import org.xml.sax.ContentHandler;
- import org.xml.sax.Locator;
- import org.xml.sax.SAXException;
- import org.xml.sax.XMLReader;
- import org.xml.sax.helpers.DefaultHandler;
- public class Demo2 {
- public static void main(String[] args) throws ParserConfigurationException,IOException {
- //1、创建sax工厂
- SAXParserFactory factory=SAXParserFactory.newInstance();
- //2、得到解析器
- SAXParser saxParser=factory.newSAXParser();
- //3、得到读取器
- XMLReader reader=saxParser.getXMLReader();
- //4、设置内容处理器
- reader.setContentHandler(new TagValue());
- //5、读取xml文档
- reader.parse("src/book.xml");
- }
- }
- //获取第二个 作者的名字
- class TagValue extends DefaultHandler{
- private String currentTag;
- private int currentNum;
- private int needTagNum=2;
- @Override
- public void startElement(String uri,Attributes attributes) throws SAXException {
- currentTag=qName;
- if(currentTag.equals("作者")){
- currentNum++;
- }
- }
- @Override
- public void characters(char[] ch,int length)
- throws SAXException {
- if("作者".equals(currentTag)&¤tNum==needTagNum){
- System.out.println(new String(ch,length));
- }
- }
- @Override
- public void endElement(String uri,String qName)
- throws SAXException {
- currentTag=null;
- }
- }