前面我们提到了 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: 解析器工厂
来源: http://www.bubuko.com/infodetail-2550564.html