快速自学java编程高级语言干货笔记 - XML

XML

1.理解XML概念和优势

XML(eXtensible Markup Language) 可扩展的标记语言,文件格式:xml
目前采用1.0版本,W3C(万维网联盟 world wide web…)世界性的重力技术标准租住 给一系列内容制定标准,包含着XML

他的作用:
  1. 存储数据
  2. 数据传输格式
  3. 应用程序的配置文件
  4. AJAX的基石

2.汇编写格式良好的XML文档

XML文档由两部分组成:

  1. 声明:放在XML文档的第一行 用来标注文本文档的一个配置格式 version 采用的版本规范 encoding编码
  2. 主题的描述内容
    主题的描述由标签(元素/节点/标记)组成。
    一定有且仅有一个根标签

XML的标签

标签的语法:

<标签名 属性名="属性值"...> 标签内容</标签名>

标签的分类:

<books></books>   双标签:由开放标签和闭合标签组成的  中间可以添加内容 标签内可以添加属性信息
<books/> 单标签/自闭和标签   只能添加一些属性信息

标签的规范

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book id="bk001">
		<name>深入JVM虚拟机</name>
		<author>周志明</author>
		<desc>深入去探究JVM虚拟机,目前已发行第二版。</desc>
	</book>
	<book id="bk002">
		<name>人性的弱点</name>
		<author>戴尔·卡耐基</author>
		<desc>深入去探究人性弱点,天才在左疯子在右</desc>
	</book>	
</books>

3.了解XML中特殊字符的处理方式

有些时候我们确实需要在文件内存储一些符号,但是在XML中有些地方不允许出现< "等符号,我们可以使用转义符来解决此问题。

&lt;(less than)     <
&gt;(greater than)  >
&apos;(apostrophe)  '
&quot;(quotes)      "
&amp;               &

<![CDATA[ 无需考虑特殊符号的任意内容 ]]> 
这个的使用可以在批量文本的时候,
可以使用常规的符号比如< >号可以直接使用符号

4.了解解析器和DOM树节点构造

DOM解析:它是会将XML内容加载到内存中生成对应的文档结构树(DOM树)。

DOM(Document Object Model)

在文档结构树中,它是由一系列的节点构成的,节点有不同的类型,

例如:标签转换为了元素节点。

5.会使用DOM操作XML数据

package cn.kgc.demo1;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
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;

public class DOMParser {

	private static Document document;
	
	/**
	 * 将内存中DOM树持久化到本地XML文件
	 * @param destXMLPath
	 * @throws Exception 
	 */
	public static void transformDocument(String destXMLPath) throws Exception {
		// 1.创建转换器工厂对象
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		// 2.创建转换器对象
		Transformer transformer = transformerFactory.newTransformer();
		// 3.指定数据源和输出目的地
		Source xmlSource = new DOMSource(document);
		Result outputTarget = new StreamResult(new File(destXMLPath));
		// 4.配置转换格式
		transformer.setOutputProperty("encoding", "UTF-8");
		// 5.转换器对象进行转换XML
		transformer.transform(xmlSource , outputTarget);
	}
	
	/**
	 * 添加XML内容
	 * 为了添加XML内容 思路:
	 * 1. 在内存中创建<book>元素节点
	 * 2. 给<book>元素节点添加id属性
	 * 3. 分别创建<name> <author> <desc>元素节点  并且指定好内容
	 * 4. 将三个元素节点添加到<book>元素节点下
	 * 5. 将<book>元素节点添加到<books>节点下
	 */
	private static void addXMLContent() {
		// 1. 在内存中创建<book>元素节点
		Element bookEle = document.createElement("book");
		// 2. 给<book>元素节点添加id属性
		bookEle.setAttribute("id", "bk003");
		// 3. 分别创建<name> <author> <desc>元素节点  并且指定好内容
		Element nameEle = document.createElement("name");
		nameEle.setTextContent("聊斋志异");
		Element authorEle = document.createElement("author");
		authorEle.setTextContent("蒲松龄");
		Element descEle = document.createElement("desc");
		descEle.setTextContent("老舍:鬼狐有性格,笑骂成文章。");
		// 4. 将三个元素节点添加到<book>元素节点下
		bookEle.appendChild(nameEle);
		bookEle.appendChild(authorEle);
		bookEle.appendChild(descEle);
		// 5.将<book>元素节点添加到<books>节点下
		Node booksNode = document.getElementsByTagName("books").item(0);
		booksNode.appendChild(bookEle);
	}
	
	/**
	 * 展示XML的内容
	 * 为展示此XML的内容 思路:
	 * 1. 获取所有的<book>元素节点
	 * 2. 遍历出每一个<book>元素节点
	 * 	2.1 获取它的id属性值
	 *  2.2 获取它的所有子元素节点 
	 *  2.3 遍历出每一个子元素,分别获取对应的元素内容
	 */
	public static void getXMLContent() {
		// 1.获取所有的<book>元素节点
		NodeList bookNodeList = document.getElementsByTagName("book");
		// 2.遍历出每一个<book>元素节点
		for(int i = 0; i < bookNodeList.getLength(); i++) {
			// 每一个book元素节点
			Node bookNode = bookNodeList.item(i);
			// 2.1 获取它的id属性值
			Element bookEle = (Element)bookNode;
			String bookId = bookEle.getAttribute("id");
			System.out.println("id:"+bookId);
			// 2.2 获取它的所有子元素节点 
			NodeList bookChildNodes = bookEle.getChildNodes();
			// 遍历出每一个子元素,分别获取对应的元素内容
			for(int j = 0; j < bookChildNodes.getLength(); j++) {
				Node bookChildNode = bookChildNodes.item(j);
				// 因为你获取的<book>下的所有子节点 不仅仅包含元素节点 转换类型要小心
				if(bookChildNode instanceof Element) {
					Element bookChildEle = (Element)bookChildNode;
					String tagName = bookChildEle.getTagName();
					String textContent = bookChildEle.getTextContent();
					System.out.println(tagName+":"+textContent);
				}
			}
			System.out.println("-------------------------------");
		}
	}
	
	/**
	 * 加载XML 产生DOM树对象
	 * @param xmlPath
	 * @throws Exception 
	 */
	public static void getDocument(String xmlPath) throws Exception {
		// 1.创建解析器工厂对象
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		// 2.解析器工厂创建解析器对象
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		// 3.解析器对象解析XML 产生DOM树对象
		document = documentBuilder.parse(new File(xmlPath));
	}
	
	
	public static void main(String[] args) throws Exception {
		// 1.加载DOM树
		getDocument("src/books.xml");
		// 2.查看XML内容
		getXMLContent();
		// 3.给XML添加内容
		addXMLContent();
		// 4.将内存中的DOM树内容持久化到本地文件
		transformDocument("src/books.xml");
	}
}

6. 使用DOM操作XML(修改和删除)

根据标签名获取元素节点列表:NodeList getElementsByTagName(String tagName);

获取节点列表的长度:int getLength();

根据索引获取节点列表中的元素:Node item(int index);

获取元素节点的属性:String getAttribute(String name);

设置元素节点的属性:void setAttribute(String name,String value);

获取和设置元素节点内容:

String getTextContent();

void setTextContent(String textContent);

获取元素节点的元素名:String getTagName();

获取节点的所有子节点列表:NodeList getChildNodes();

获取节点的父节点:Node getParentNode();

删除某个子节点:void removeChild(Node childNode);

7.使用DOM4J操作XML(CRUD)

1.6.1版本。

获取根元素:Element getRootElement();

获取指定名称的所有的子元素节点:List elements(String tagName);

获取所有的子元素节点:List elements();

获取指定的子元素节点(单个):Element element(String tagName);

获取指定子元素的内容:String elementText(String tagName);

获取指定子元素的内容(去除空格):String elementTextTrim(String tagName);

给元素节点添加属性:void addAttribute(String name,String value);

给元素节点添加内容:void addText(String text); 如果有内容则使用void setText(String text);

根据名称创建并添加子元素节点:Element addElement(String tagName);

删除子元素节点:void remove(Element element);

package cn.kgc.demo2;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class DOM4JParser {

	// 别导错包
	private static Document document;
	
	/**
	 * 删除XML内容
	 * 需求:删除最后一个元素节点内容
	 */
	private static void deleteXMLContent() {
		// 获取根元素
		Element booksEle = document.getRootElement();
		// 获取所有的book元素
		List<Element> bookEleList = booksEle.elements("book");
		// 获取最后一个
		Element removeBookEle = bookEleList.get(bookEleList.size() - 1);
		// 删除元素
		booksEle.remove(removeBookEle);
	}
	
	/**
	 * 修改XML内容
	 * 需求:修改元素节点的内容 <book id="bk003">
	 * 	name:时间简史
	 * 	author:霍金
	 * 	desc:霍金著作!探究宇宙奥秘!
	 */
	public static void updateXMLContent() {
		// 获取根元素
		Element booksEle = document.getRootElement();
		// 获取并遍历所有的<book>子元素列表
		List<Element> bookEleList = booksEle.elements("book");
		for (Element bookEle : bookEleList) {
			// 查找bk003元素
			if(bookEle.attributeValue("id").equals("bk003")) {
				// 更改name  author  desc内容
				Element nameEle = bookEle.element("name");
				nameEle.setText("时间简史");
				Element authorEle = bookEle.element("author");
				authorEle.setText("霍金");
				Element descEle = bookEle.element("desc");
				descEle.setText("霍金著作!探究宇宙奥秘!");
			}
		}
	}
	
	/**
	 * DOM树转换为XML文档
	 * @param destXMLPath
	 * @throws Exception 
	 */
	public static void formatDOM2XML(String destXMLPath) throws Exception {
		XMLWriter xmlWriter = null;
		try {
			// 创建输出转换器对象 
			// compact紧凑的  format格式
			// OutputFormat outputFormat = OutputFormat.createCompactFormat();
			// pretty漂亮的
			OutputFormat outputFormat = OutputFormat.createPrettyPrint();
			// 指定字符编码
			outputFormat.setEncoding("UTF-8");
			// 指定数据源和输出目的地
			xmlWriter = new XMLWriter(new FileOutputStream(destXMLPath), outputFormat);
			// 输出内容
			xmlWriter.write(document);
		} finally{
			// 关流
			xmlWriter.close();
		}
	}
	
	/**
	 * 添加XML内容
	 */
	public static void addXMLContent() {
		// 获取根元素
		Element booksEle = document.getRootElement();
		// 根元素添加子元素节点<book>
		Element bookEle = booksEle.addElement("book");
		bookEle.addAttribute("id", "bk003");
		// 分别添加<name><author><desc>子元素节点  并赋值内容
		Element nameEle = bookEle.addElement("name");
		nameEle.setText("大话设计模式");
		Element authorEle = bookEle.addElement("author");
		authorEle.setText("程杰");
		Element descEle = bookEle.addElement("desc");
		descEle.setText("设计模式一点都不可怕!杰佬带你飞!");
	}

	
	/**
	 * 查询XML内容
	 */
	public static void getXMLContent() {
		// document.getElementsByTagName("books").item(0);
		// 获取根元素
		Element booksEle = document.getRootElement();
		// 获取并遍历所有的子元素节点
		List<Element> bookEleList = booksEle.elements();
		for (Element bookEle : bookEleList) {
			// 获取id属性
			String id = bookEle.attributeValue("id");
			// 获取name元素内容(也可以先获取元素节点对象 然后再获取元素节点内容)
			// 可以自动去除内容空格
			String name = bookEle.elementTextTrim("name");
			// 获取author元素内容
			String author = bookEle.elementTextTrim("author");
			// 获取desc元素内容
			String desc = bookEle.elementTextTrim("desc");
			System.out.println(id+" - "+name+" - "+author+" - "+desc);
		}
	}
	
	/**
	 * 加载DOM树
	 * @param xmlPath
	 * @throwsException 
	 */
	public static void loadDocument(String xmlPath) throws Exception {
		SAXReader saxReader = new SAXReader();
		document = saxReader.read(new File(xmlPath));
	}
	
	public static void main(String[] args) throws Exception {
		// 加载DOM树
		loadDocument("src/books.xml");
		// 增加XML内容
		// addXMLContent();
		// 修改XML内容
		// updateXMLContent();
		// 删除XML内容
		deleteXMLContent();
		// 将内存中的DOM树转换为XML文档内容
		formatDOM2XML("src/books.xml");
		// 查询XML内容
		getXMLContent();
	}


}

猜你喜欢

转载自blog.csdn.net/weixin_44793608/article/details/90720628
今日推荐