xml文件的解析

XML的解析 【与java程序来进行配合】

xml的解析方式有两种:dom和sax
dom解析
根据xml层级结构 在内存中分配一个树形结构 把xml中的每部分都会封装成一个对象
在图中分析了两种解析方式【先讲dom解析】
想要解析xml 还要具备一个东西:xml的解析器
不同的公司或者组织提供了针对dom和sax解析方式的解析器 并且提供了对应的api
sun公司提供了 解析器:jaxp 【先讲的】
dom4j组织提供了解析器:dom4j [常用的是dom4j]
jdom组织提供了解析器:jdom
dom4j --> jdom的升级版
jaxp的解析器解析xml
是sun公司提供的  也就是jaxp是javase的一部分 对应的解析器的类放置在javax.xml.parsers包中
在该包下有四个类
DocumentBuilder
是一个抽象类 无法直接实例化 
实例化方式:DocumentBuilderFactory.newDocumentBuilder() 方法获取
先创建一个factory对象 调用对象方法newDocumentBuilder()
DocumentBuilder builder=factory.newDocumentBuilder();
该类中有一个方法:获取解析对应的xml文件 并返回该xml文件对应的Document文档对象
Document parse(String uri) 
 
  想解析文档中有哪些内容 【去查看Document类型的api】
 
  元素类型 Element
  属性对象类型 Attr
  文本对象类型 Text
 
  他们几个都是接口  父接口是Node
DocumentBuilderFactory
SAXParser
SAXParserFactory
使用jaxp解析器用dom的解析方式实现xml的解析
实现查询操作
实现查询第一个name的值
添加节点
删除节点
遍历所有节点
使用jaxp解析器用sax的解析方式实现xml的解析
sax 不支持增删改的操作的 只能用于查询
事件驱动的形式 是从上往下走的
使用dom4j解析器采用把dom和sax给融合了
dom4j不是javase的一部分 如果想使用的话 -- 在工程中导入dom4j的jar包
 
获得解析器
SAXReader sax = new SAXReader();
根据解析器 绑定文档 并返回Document
Document doc = sax.read("文件路径")
XPath
xml获取数据时 一层一层的获得 如果想获得层次较深的数据  再一层一层去获取就比较麻烦
dom4j就提供了一种新的功能XPath
XPath就是一个表达式 根据这个表达式可以获得指定层的元素
表达式格式:这里斜线后面第一个都是根节点【或者直接 // 开头没与此要求】                                          A是根元素
1./A/B/C
想获取的是A下B下的C
2.//B
获得任意层的B元素
//D/B
获得任意层的D下的B元素
3./A/B/C/*
获得c下的所有元素
/*/*/*/B
无论哪一层 只要第四层是B的元素
4. /A/B[1]
A下的第一个B
/A/B[last()]
A下的最后一个B
5.
//B[@id1]
所有层下 具有id1属性的B
6. 
//B[@id1="m"]
获得所有层 属性名师id1 属性值是m的B元
dom4j默认是不支持XPath 如果想使用XPath这种格式 需要导入包 jaxen.jar
dom4j中提供了两个方法来支持XPath
selectNodes("XPath的表达式")
获得多个节点
selectSingleNode("XPath表达式")
根据XPath表达式获得单个节点


这里有需要导入的jar  我放在了lib.jar压缩包中,大家可以解压使用

案例:

例一:dom解析XML
import java.io.IOException;
import java.util.Iterator;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class DomParsers {
public static void main(String[] args) throws Exception {
selectAll();
// addNode();
// deleteNode();
showNodes();
}

public static void selectAll() throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc=builder.parse("src\\day30\\person.xml");
NodeList list= doc.getElementsByTagName("name");
NodeList listage= doc.getElementsByTagName("age");
 
for (int i=0; i<list.getLength();i++) {
String value=list.item(i).getTextContent();
System.out.println(value);
System.out.println(listage.item(i).getTextContent());
}
}
public static void addNode() throws ParserConfigurationException, SAXException, IOException, TransformerException {
//1.创建解析器对象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
//获取document对象
Document doc = builder.parse("src\\day30\\person.xml");
// 获取节点
Node pNode = doc.getElementsByTagName("p").item(0);
// 创建sex节点
Element sex=doc.createElement("sex");
//添加节点
pNode.appendChild(sex);
//创建文本节点
Text text=doc.createTextNode("女");
sex.appendChild(text);
//回写类
TransformerFactory tfFactory=TransformerFactory.newInstance();
Transformer transformer=tfFactory.newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult("src\\day30\\person.xml"));
}

public static void deleteNode() throws ParserConfigurationException, SAXException, IOException, TransformerException {
//1.创建解析器对象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
//获取document对象
Document doc = builder.parse("src\\day30\\person.xml");
// 获取节点
Node pNode = doc.getElementsByTagName("sex").item(0);
//获取父节点
Node parentNode=pNode.getParentNode();
//通过父节点删除子节点
parentNode.removeChild(pNode);
//回写类
TransformerFactory tfFactory=TransformerFactory.newInstance();
Transformer transformer=tfFactory.newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult("src\\day30\\person.xml"));
}

public static void showNodes() throws SAXException, IOException, ParserConfigurationException {
//1.创建解析器对象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
//获取document对象
Document doc = builder.parse("src\\day30\\person.xml");
getNode(doc);
}
public static void getNode(Node node) {
//node的getType() 返回值是short类型
if (node.getNodeType() == Node.ELEMENT_NODE) {
String name = node.getNodeName();
System.out.println(name);
}
//获取所有子节点
NodeList nList = node.getChildNodes();
for(int i=0;i<nList.getLength();i++) {
Node n = nList.item(i);
// 递归调用
getNode(n);
}
}

}
例子二:SAX解析XML
package day30.SAXParsers;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXParse1 {
public static void main(String[] args) throws Exception {
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser sParser=factory.newSAXParser();
MyHandler handler=new MyHandler();
sParser.parse(new InputSource("src/day30/pczz001.xml"), handler);
}
}
class MyHandler extends DefaultHandler{
boolean flag=false;
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("xml文档开始!");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("xml文档开始!");
}

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("province")&& attributes.getValue(0).equals("北京")) {
flag=true;
System.out.println(attributes.getType(0));
}
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("province")) {
flag=false;
}
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (flag) {
System.out.println(new String(ch,start,length));
}
}

}
例子三:dom4j 方式解析方法,该方法是以后经常用到的比较简单的,利用了dom4j.jar封装的方法

package day30.SAXParsers;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXParse1 {
public static void main(String[] args) throws Exception {
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser sParser=factory.newSAXParser();
MyHandler handler=new MyHandler();
sParser.parse(new InputSource("src/day30/pczz001.xml"), handler);
}
}
class MyHandler extends DefaultHandler{
boolean flag=false;
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("xml文档开始!");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("xml文档开始!");
}

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("province")&& attributes.getValue(0).equals("北京")) {
flag=true;
System.out.println(attributes.getType(0));
}
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("province")) {
flag=false;
}
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (flag) {
System.out.println(new String(ch,start,length));
}
}
}

大家复制使用时注意导入jar,并且注意不同类引用的不同jar包下的父类,不要引用错了这里就无法得到正确结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值