XML

XML概述

XML(EXtensible(扩展) Markup(标记) Language(语言), 可扩展的标记语言)

作用:

  • 传输数据
  • 存储数据
  • 存储配置信息(配置文件)
  • ...

XML文档结构

基本结构

<?xml version="1.0" encoding="UTF-8"?>
<自定义的根标签>
    <自定义的普通标签>内容</自定义的普通标签>
     <自定义的普通标签/>
</自定义的根标签>
  • <?xml version="1.0" encoding="UTF-8"?> :声明,声明当前XML文档的版本和文档编码
  • 根标签:用来在最外层包裹 XML 文档内容的
  • 普通标签:自定义,根据自己需要进行嵌套
    • 双标签:<标签名 属性名="属性值">内容</标签名>  开始标签 + 结束标签
    • 单标签:<标签名 属性名="属性值"/> 自闭和标签

编写良好格式的XML文件

  • 所有的 XML 标签必须有结束标签        
    • <标签名></标签名>
    • <标签名/>
  • XML对大小写敏感
    • <title></Title>
  • XML必须正确的嵌套
  • XML同级标签必须对齐,下一级标签缩进4个空格
  • XML不能出现特殊符号:
    • <、"、&

转义字符

  • <:&lt; less than
  • >:&gt; greater than
  • ":&quat; 引用
  • ':&apos;
  • &:&amp;

当在标签内容中需要使用的转义字符较多时,可以通过 '<![CDATA[内容]]>' 来解决。

XML解析技术

大类:

  • DOM解析
  • SAX解析

小类:

  • W3C 提供的 API,在 JRE 类库中的 org.W3C.dom 包下
  • Dom4j (DOM for Java)
  • Hutool 中的 XmlUtil
  • ....

在日常编码中,我们接触最多的除了JSON外,就是XML格式了,一般而言,我们首先想到的是引入Dom4j包,却不知JDK已经封装有XML解析和构建工具:w3c dom。但是由于这个API操作比较繁琐,因此Hutool中提供了XmlUtil简化XML的创建、读和写的过程。

XmlUtil只是w3c dom的简单工具化封装,减少操作dom的难度,如果项目对XML依赖较大,依旧推荐Dom4j框架。

 DOM数

DOM(Document Object Model,文档对象模型)

将 XML 文档转换为 DOM 树结构。

DOM数结构由节点(Node)组成

节点类型:

  1. 元素类型(标签、Element)
  2. 属性类型(Attribute)
  3. 文本类型(Text)
  4. 注释类型(Comment)
  5. ...

程序员眼里的数。

 

 Dom4j

官网

查询

// 解析XML
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/books.xml"));
		
		// Element:元素/标签节点
		// 获取根节点
		Element root = document.getRootElement();
		// 获取子节点列表
		List<Element> bookEleList = root.elements("book");
		// 遍历子节点列表
		for (Element bookEle : bookEleList) {
			// 获取子节点的内容
			String id = bookEle.elementTextTrim("id");
			String name = bookEle.elementTextTrim("name");
			String author = bookEle.elementTextTrim("author");
			System.out.println("图书编号:" + id + "书名:" + name + "作者名:" + author);
		}

新增

		// 解析XML
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/books.xml"));
		
		// 获取根节点
		Element rootElement = document.getRootElement();  
		// 添加子节点
		Element bookEle = rootElement.addElement("book");
		bookEle.addElement("id").addText("BK003");
		bookEle.addElement("name").addText("大话设计模式");
		bookEle.addElement("author").addText("程杰");
		 
		// 将内存中的document写入到XML文件
//		OutputFormat format = OutputFormat.createCompactFormat();
		// 好看的格式
		OutputFormat format = OutputFormat.createPrettyPrint();
//		format.setEncoding("UTF-8");
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/books.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
		System.out.println("新增成功!");
	}

修改

	// 解析XML
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/books.xml"));
		
		// 获取根节点
		Element rootElement = document.getRootElement();
		
		// 查询BK003图书节点
		List<Element> bookEleList = rootElement.elements("book");
		for (Element bookEle : bookEleList) {
			String id = bookEle.elementText("id");
			if (id.equals("BK003")) {
				bookEle.element("name").setText("大话数据结构");
			}
		}
		
		// 写入到XML文件
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/books.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
		System.out.println("修改成功!");

删除

// 解析XML
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/books.xml"));
		
		// 获取根节点
		Element rootElement = document.getRootElement();
		List<Element> bookEleList = rootElement.elements("book");
		for (Element bookEle : bookEleList) {
			if ("BK003".equals(bookEle.elementTextTrim("id"))) {
				// bookEle.getParent().remove(bookEle);
				rootElement.remove(bookEle);
			}
		}
		
		// 写入到XML文件
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/books.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
		System.out.println("删除成功!");

XmlUtil

Document document = XmlUtil.readXML(new File("src/books.xml"));
Object value = XmlUtil.getByXPath("//books/book/id", document, XPathConstants.STRING);
System.out.println(value);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值