前面我们提到了xml解析的技术有两种:dom 和 sax,解析器对于不同的公司和组织也有所不同,sun公司的jaxp,dom4j组织的dom4j,jdom组织的jdom,今天我们就来了解一下sun公司的jaxp解析器是如何解析xml的;
*jaxp的api查看
*jaxp是javase的一部分
*jaxp解析器在jdk的javax.xml.parsers包里面
**四个类:分别是针对dom和sax技术解析使用的类
**dom
DocumentBuilder:解析器类
-这个类是一个抽象类,不能new
-这个类的实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获取
-这个类具有一个方法可以解析xml,即parse(“xml路径”),返回的是Document整个文档
-返回的Document是一个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找
***Document里面的常用方法:
-getElementsByTagName(String tagname)
-这个方法可以得到标签,返回集合NodeList
-createElement(String tagname)
-创建标签
-createTextNode(String data)
-创建文本
-appendChild(Node newChild)
-把文本或标签添加到标签下面
-removeChild(Node oldChild)
-删除节点
-getParentNode()
-获取父节点
**NodeList集合(list)
- getLength() 得到集合的长度
- item(int index) 根据下标取到具体的值
for(int i=0;i<list.getLength( );i++){
list.item( i );
}
DocumentBuilderFactory:解析器工厂
-这个类也是一个抽象类,不能new
-通过本身的newInstance()获取DocumentBuilderFactory的实例
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <persion> <p> <name>fangwenhui</name> <age>20</age> <sex>boy</sex> </p> <p> <name>fangwenbin</name> <age>23</age> <sex>boy</sex> </p> </persion>
**使用jaxp实现查询操作
**查询xml中所有name元素的值
/*
* 1、创建解析器工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance( );
* 2、根据解析器工厂创建解析器
DocumentBuilder builder=builderFactory.newDocumentBuilder( );
* 3、解析xml得到document对象
Document document=builder.parse("src/persion.xml");
* 4、得到所有的name元素
使用document.getElementsByTagName("name");
* 5、返回集合,遍历集合,得到所有的name元素
- 遍历 getLength() item()
- 得到元素里面的值 使用 getTextContent()
*/
**查询xml中第一个name元素的值
/*
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、解析xml得到document对象
* 4、得到所有的name元素
* 5、返回集合,使用集合里的方法item(),根据下标获取具体的元素
-NodeList.item(下标):集合下标从0开始
* 6、得到具体的值 使用 getTextContent()方法
*/
**使用jaxp实现添加节点操作
**在第一个p标签下(末尾)添加<height>172</height>
/*
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、解析xml文件得到document对象
* 4、得到第一个p标签
* 5、创建属性标签 createElement
* 6、创建文字内容节点 createTextNode
* 7、将文字内容节点添加到标签下 appendChild
* 8、将标签添加到第一个p标签下 appendChild
* 9、回写xml
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new StreamResult("src/persion.xml"));
*/
**使用jaxp实现删除节点操作
**删除<height>172</height>节点
/*
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、解析xml文件得到document对象
* 4、获取height元素
* 5、获取height的父节点,使用getParentNode()方法
* 6、删除使用其父节点删除,使用removeChild()方法
* 7、回写xml
*/
**使用jaxp实现遍历节点操作
**递归遍历的方法
/*
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、解析xml文件得到document对象
* 4、调用方法:list1(document)
*/
private static void list1(Node node) {
//判断是元素类型的时候才打印
if(node.getNodeType()==Node.ELEMENT_NODE)
System.out.println(node.getNodeName());
//得到一层子节点
NodeList list=node.getChildNodes();
//遍历list
for(int i=0;i<list.getLength();i++){
//得到每一个节点
Node child=list.item(i);
//递归调用
list1(child);
}
}
**sax
SAXParser:解析器类
SAXParserFactory:解析器工厂
转载于:https://blog.51cto.com/13537308/2094960