【常用API】之XML文档解析
2020-12-22 16:26
标签:引号 编码问题 实体 pen 三级 字符串操作 系统 extc vat 【XML文档】: 数据彼此交互,本地可以使用 序列化文件。 如果数据需要提供互联网共享, xml是利用一套标记标签进行内容(数据)的定义与描述的。 【定义与使用】: xml文档的定义有严格规定: 创建XML文档,也需要流对象: FileInputStream 基础字节输出流(写) PrintStream 打印流 .print(String) 方法,一次性写入 创建XML实例: 1、首先创建一个用户实体模型类User,用于生成XML 2、根据XML文档定义的格式,手动生成XML文档 解析XMl的方式有两种,一种SAX方式,一种DOM方式 SAX解析: DOM解析: 【常用API】之XML文档解析 标签:引号 编码问题 实体 pen 三级 字符串操作 系统 extc vat 原文地址:https://www.cnblogs.com/jiarenanhao/p/14147800.html
主要针对本地化操作:应用程序,游戏。
序列化操作,必须有原始类文件。
企业与企业之间进行数据交互。
那就使用XML文档。
XML文档,是由 W3C 定义的一套标准规范。
所有语言,所有平台都兼容识别。
【xml文档不受平台与语言的限制,跨平台,跨语言】
XML:可扩展的 标记 语言
内容结束标签>
1、文档必须是.xml结尾的后缀
2、文档第一行开始部分,必须是一个声明,
且声明的前面不能有任何内容。
3、一个xml文档中,只能有一个最大的根元素
4、如果标签有属性,属性必须小写,且属性的值必须有双引号package com.xzm.test;
//用户的数据实体模型类
public class User {
//属性
private int id;
private String name;
private int age;
//属性封装
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.xzm.test;
//导入需要的包文件
import java.util.List;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
public class 生成_XML {
public static void main(String[] args) {
//【生产数据 放入集合中】==========================
List
");
//遍历集合,组合中间的内容
for(User u : list)
{
//二级标签---开始
sb.append("
");
//预览组合数据
System.out.println(sb);
//=======================================================
//【生成xml】
try {
//注意:
// 由于操作系统是简体中文的,默认系统生成的文件都是ANSI(gb2312),
// 我们的内容中有特殊字符,但是文档声明为 utf-8
// 如果直接写文件,字符流是可以的,但是会容易导致:中文乱码。
// 【打印流:PrintStream】,直接解决编码问题。
//创建基础字节输出流(文件的保存格式是字节)
//这里不需要File对象,直接指定路径文件名
//没有指定物理路径:当前项目根目录下
FileOutputStream fos = new FileOutputStream("table.xml");
//创建 高层 内容 打印流
//【必须使用三个参数的构造方法实例化】
//(流对象,是否自动完成true,编码utf-8)
PrintStream ps = new PrintStream(fos, true, "utf-8");
//调用方法打印
ps.print(sb);
//关闭
ps.close();
fos.close();
//结果
System.out.println("创建成功!");
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}
表示的是通过代码,逐行解析,
会按照层次关系,一个个一次提取递进。
优点:内存消耗少,每次只有一个信息
缺陷:必须按照它的顺序进行逐步操作
必须实现一个类对象,且重写方法去操作package com.xzm.test;
import java.io.FileInputStream;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAX解析_XML {
public static void main(String[] args) {
try {
//SAX解析方式:
// 打开文件,按照流的方式,一个一个节点递进的。
// 节约内存使用,但是会长时间链接文件,不能任意控制。
//第一步:
// 自定义一个类,继承DefaultHandler类,
// 重写里面的方法
// 这些方法都是自动调用的,我们只要实现里面具体的代就可以
//第二步:
// 得到一个SAX解析工厂
SAXParserFactory sax = SAXParserFactory.newInstance();
//第三步:
// 基于工厂,得到解析对象
SAXParser sp = sax.newSAXParser();
//第四步:
// 创建基础输入流
FileInputStream fis = new FileInputStream("table.xml");
//第五步:
// 调用方法,解析文档
// 基于输入流操作的,同时提供类对象
// 读取过程,自动调用类中重写的方法
sp.parse(fis, new MyHandler());
//关闭
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//==============================================================
class MyHandler extends DefaultHandler
{
//文档开始
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("文档开始");
}
//读取到-开始标签: qName:标签名称
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
System.out.println("");
}
//标签中的内容
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
//标签中的内容,程序会按照一个个字符char,读取出来,
//保存到数组 ch 中,
//会记录开始的字符索引,同时记录内容的长度
//当前方法自动传入
//把这三个参数 直接给 String类对象
//String类对象会自动从整个字符串文本中,提取出这一点信息
String str = new String(ch, start, length);
System.out.println(str);
}
//读取到-结束标签
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
System.out.println(""+qName+">");
}
//文档结束
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("文档结束");
}
}
表示的是 Document 文档解析,
它可以一次性把整个xml文档的内容提取出来。
优点:用户可以任意 遍历、提取、操作等等。
缺陷:内存消耗过大package com.xzm.test;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DOM解析_XML {
public static void main(String[] args) {
try {
//DOM解析方式:
// 通过Dom工厂,一次性把文档信息读取到内存上
// 减少了IO操作,增加内存使用
//第一步:
// 得到一个文档构建工厂,调用类中静态方法得到对象的
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//第二步:
// 基于工厂,得到一个文档构建对象
DocumentBuilder db = dbf.newDocumentBuilder();
//第三步:
// 指定数据源文档对象
File f = new File("table.xml");
//第四步:
// 通过文档对象调用方法,获取数据源所有内容
Document doc = db.parse(f);
//======================================================
//此时:doc对象中,已经得到了整个xml中的所有内容
//接下来,就是基于doc对象,在里面操作了
//doc读取的文档信息中,有以下三种类型的内容:
// 声明:// 元素:Element:最大的根元素:
// 节点:Node:内部的元素:table标签中包括的所有
//【得到最大的根元素】
Element table = doc.getDocumentElement();
//【得到这个根元素的节点名称】
//String name = table.getNodeName();
//System.out.println(name);
//【第一层:子节点】
//在根元素中,得到第一层子节点
//基于根对象,获取所有的子节点
//【注意:换行也会当作节点】
NodeList nl = table.getChildNodes();
//System.out.println( nl.getLength() );
//循环遍历每一个二级子节点
for(int i=0; i
上一篇:vue.js
下一篇:C#不区分大小写的字符串替换