00 02Java Web开发之XML解析之JAXP

1 XML解析简介(写到Java代码)

  • xml是标记型文档
  • JS使用dom解析标记型文档:
    |——根据html的层级结构,在内存中分配一个树形结构,把html的标签、属性和文本都封装成对象。
    |——document对象、element对象、属性对象、文本对象、Node节点对象
  • xml的解析方式(技术):dom和sax

2 JAXP API查看

想要解析xml,首先需要解析器。不同的公司和组织提供了针对dom和sax方式的解析器,通过api的方式提供。sun公司提供了针对dom和sax解析器——jaxp;dom4j组织提供了针对dom和sax解析器—— dom4j(实际开发中使用最多);jdom组织提供了针对dom和sax解析器——jdom。

JAXP的API
|——jaxp是javase的一部分
|——jaxp解析器在jdk的javax.xml.parsers包里面
|————四个类:分别针对dom和sax解析使用的类
|————dom:
|——————DocumentBuilder:解析器类,这个类是一个抽象类,不能new。此类可以通过DocumentBuilderFactory.newDocumentBuilder()方法获取。此类中的public Document parse​(File f) throws SAXException, IOExceptionpublic Document parse​(String uri) throws SAXException,IOException可以解析xml,返回的是一个Document对象。但是返回的Document对象是一个接口,在包org.w3c.dom中,父结点是Node,如果在接口Document里面找不到想要的方法,到Node里面去找。
接口public interface Document extends Node方法摘要

No. 方法名称 方法类型 方法解释
01 NodeList getElementsByTagName​(String tagname) 普通方法 可以得到标签,返回的是一个集合NodeList
02 Element createElement​(String tagName) throws DOMException 普通方法 创建标签,返回一个Element对象
03 Text createTextNode​(String data) 普通方法 创建文本,返回创建文本对象
04 Node appendChild​(Node newChild) throws DOMException 普通方法 把文本添加到标签下面,返回添加节点对象
05 Node removeChild​(Node oldChild) throws DOMException 普通方法 删除节点,返回被删除节点对象
06 Node getParentNode() 普通方法 获取父结点

接口public interface NodeList方法摘要

No. 方法名称 方法类型 方法解释
01 int getLength() 普通方法 得到集合长度
02 Node item​(int index) 普通方法 下标得到具体的值

接口public interface Node方法摘要

No. 方法名称 方法类型 方法解释
01 String getTextContent() throws DOMException 普通方法 得到标签里的内容

String getTextContent()
throws DOMException
|——————DocumentBuilderFactory:解析器工厂,这个类也是抽象类,不能new。但是可以使用抽象类里的静态方法newInstance()获取DocumentBuilderFactory的实例
|————sax:
|——————SAXParser:解析器类
|——————SAXParserFactory:解析器工厂

3 使用JAXP查询节点

<?xml version="1.0" encoding="UTF-8"?>
<person>
    <p1>
        <name>lks</name>
        <age>23</age>
    </p1>
    <p1>
        <name>hhy</name>
        <age>20</age>
    </p1>
</person>

查询XML中所有元素的值。
(1)创建解析器工厂
(2)根据解析器工厂创建解析器
(3)解析xml返回Document对象
(4)得到所有的name元素
(5)遍历集合,得到每一个name元素

private static void selectAll() throws ParserConfigurationException, SAXException, IOException {
		DocumentBuilderFactory docbuilderfactory = DocumentBuilderFactory.newInstance();
		
		DocumentBuilder docbuilder = docbuilderfactory.newDocumentBuilder();
		
		Document doc = docbuilder.parse("src/dtdlearn/mydtd00/person.xml");
		
		NodeList nodelist = doc.getElementsByTagName("name");
		for(int i = 0; i < nodelist.getLength(); i++) {
			Node n = nodelist.item(i);
			String str = n.getTextContent();
			System.out.println(str);
		}
	}

4 使用JAXP查询某一节点

查询XML中第一个name元素的值。
(1)创建解析器工厂
(2)根据解析器工厂创建解析器
(3)解析xml返回Document对象
(4)得到所有name元素
(5)使用返回集合里面方法item下标获取具体元素
(6)得到具体的值,使用getTextContent()

private static void searchElement() throws Exception{
		DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
		
		DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
		
		Document document = documentbuilder.parse("src/dtdlearn/mydtd00/person.xml");
		
		NodeList nodelist = document.getElementsByTagName("name");
		
		Node node = nodelist.item(0);
		
		System.out.println(node.getTextContent());
		
	}

5 使用JAXP添加节点

在第一个p1下面添加一个<sex>女</sex>
(1)创建解析器工厂
(2)根据解析器工厂创建解析器
(3)解析xml返回Document对象
(4)得到第一个p1,得到所有p1,使用item下标得到
(5)创建sex标签 createElement
(6)创建文本 createTextNode
(7)把文本添加到sex下面 appendChild
(8)把sex添加到第一个p1下面
(9)回写xml transformer

private static void addElement() throws Exception{
		DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
		
		DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
		
		Document document = documentbuilder.parse("src/dtdlearn/mydtd00/person.xml");
		
		NodeList nodelist = document.getElementsByTagName("p1");
		
		Node node = nodelist.item(0);
		
		Node sex = document.createElement("sex");
		
		Text text = document.createTextNode("女");
		
		sex.appendChild(text);
		
		node.appendChild(sex);
		
		TransformerFactory transformerfactory = TransformerFactory.newInstance();
		
		Transformer transformer = transformerfactory.newTransformer();
		
		transformer.transform(new DOMSource(document), new StreamResult("src/dtdlearn/mydtd00/person.xml"));
	}

6 使用JAXP修改节点

修改第一个p1下面的sex内容为男
(1)创建解析器工厂
(2)根据解析器工厂创建解析器
(3)解析xml返回Document对象
(4)得到p1下的sex
(5)修改sex里面的值 setTextContent()
(6)回写xml transformer

public static void modifyElement() throws Exception{
		DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
		
		DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
		
		Document document = documentbuilder.parse("src/dtdlearn/mydtd00/person.xml");
		
		NodeList nodelist = document.getElementsByTagName("sex");
		
		Node node = nodelist.item(0);
		
		node.setTextContent("男");
		
		TransformerFactory transformerfactory = TransformerFactory.newInstance();
		Transformer transformer = transformerfactory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult("src/dtdlearn/mydtd00/person.xml"));
	}

7 使用JAXP删除节点

删除p1下的sex节点。
(1)创建解析器工厂
(2)根据解析器工厂创建解析器
(3)解析xml返回Document对象
(4)获取sex元素
(5)获取sex元素的父结点 getParentNode
(6)借助父节点删除sex节点
(7)回写xml

public static void deleteElement() throws Exception{
		DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
		Document document = documentbuilder.parse("src/dtdlearn/mydtd00/person.xml");
		
		NodeList nodelist = document.getElementsByTagName("sex");
		
		Node node = nodelist.item(0);
		
		Node parent = node.getParentNode();
		
		parent.removeChild(node);
		
		TransformerFactory transformerfactory = TransformerFactory.newInstance();
		Transformer transformer = transformerfactory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult("src/dtdlearn/mydtd00/person.xml"));
		
	}

8 使用JAXP遍历节点

把xml所有名称打印出来。

public static void traverseElement() throws Exception{
		DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
		Document document = documentbuilder.parse("src/dtdlearn/mydtd00/person.xml");
		
		list(document.getFirstChild());
	}
	
	public static void list(Node node) {
		if(node.getNodeType()==Node.ELEMENT_NODE) {
			System.out.println(node.getNodeName());
		}
			
		NodeList nodelist = node.getChildNodes();
		for(int i = 0; i < nodelist.getLength(); i++) {
			Node node1 = nodelist.item(i);
			list(node1);
		}
	}
发布了77 篇原创文章 · 获赞 11 · 访问量 2638

猜你喜欢

转载自blog.csdn.net/weixin_43762330/article/details/104532573