共计 7902 个字符,预计需要花费 20 分钟才能阅读完成。
1. 什么是 XML?
XML 指可扩大标记语言(EXtensible Markup Language)
XML 是一种标记语言,很相似 HTML
XML 的设计主旨是传输数据,而非显示数据
XML 标签没有被预约义。您须要自行定义标签。
XML 被设计为具备自我描述性。
XML 是 W3C 的举荐规范
2. 为什么应用 XML?
咱们没有 XML 这种语言之前,咱们应用的是 String 作为两个程序之间的通信!当初问题就来了,如果咱们传输的是带有关系型构造的数据,String 怎么表白呢?String 对关系型数据不善于,要是形容起来也难免会有歧义的时候!
HTML 语言自身就有缺点:
标记都是固定的,不能自定义。HTML 语言中有什么标记就只能用什么标记
HTML 标签自身就短少含意(tr 标签外面什么内容都能放进去,不标准!)
HTML 没有实现真正的国际化
3. XML 的用处
①:配置文件(例子:Tomcat 的 web.xml,server.xml……),XML 可能十分清晰形容出程序之间的关系
②:程序间数据的传输,XML 的格局是通用的,可能缩小替换数据时的复杂性!
③:充当小型数据库,如果咱们的数据有时候须要人工配置的,那么 XML 充当小型的数据库是个不错的抉择,程序间接读取 XML 文件显然要比读取数据库要快呢!
4. xml 的技术架构
XML 被设计为“什么都不做”,XML 数据或 XML 文档只用于组织、存储数据,除此之外的数据生成、读取、传送、存取等等操作都与 XML 自身无关!
于是乎,想要操作 XML,就须要用到 XML 之外的技术了:
为 XML 定规定:当初个别应用 DTD 或 Schema 技术,当然了 Schema 技术更为先进!
解析 XML 的数据:个别应用 DOM 或者 SAX 技术,各有各的长处
提供款式:XML 个别用来存储数据的,但设计者野心很大,也想用来显示数据 (但没人用 XML 来显示数据),就有了 XSLT(eXtensiable Stylesheet Language Transformation) 可扩大款式转换语言
5. XML 语法
5.1 文档申明
XML 申明放在 XML 的第一行
version —— 版本
encoding —— 编码
standalone–独立应用 —— 默认是 no。standalone 示意该 xml 是不是独立的。
如果是 yes,则示意这个 XML 文档时独立的,不能引用内部的 DTD 标准文件;
如果是 no,则该 XML 文档不是独立的,示意能够援用内部的 DTD 标准文档。
正确的文档申明格局,属性的地位不能扭转!
<!-- 正确的文档申明格局,属性的地位不能扭转!-->
<?xml version="1.0" encoding="utf-8" standalone="no"?>
5.2 元素
元素中须要值得注意的中央:
XML 元素中的呈现的空格和换行都会被当做元素内容进行解决
每个 XML 文档必须有且只有一个根元素
元素必须闭合
大小写敏感
不能穿插嵌套
不能以数字结尾
XML 的语法是标准的!不要随便乱写!
5.3 属性
属性是作为 XML 元素中的一部分的,命名标准也是和 XML 元素一样的!
<!-- 属性名是 name,属性值是 chinese -->
<china name="chinese">
</china>
5.4 CDATA
在编写 XML 文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容解决。
遇到此种状况,能够把这些内容放在 CDATA 区里,对于 CDATA 区域内的内容,XML 解析程序不会解决,而是间接一成不变的输入。
<![CDATA[ 内容]]>
5.5 转义字符
对于一些单个字符,若想显示其原始款式,也能够应用本义的模式予以解决。
6. XML 解析
6.1 XML 解析形式有两种:
①:dom (Document Object Model):文档对象模型,是 W3C 组织举荐解析 XML 的一种形式。
②:sax (Simple API For XML):它是 XML 社区的规范,简直所有 XML 解析器都反对它!
6.2 XML 解析操作
应用程序不是间接对 XML 文档进行操作的,而是由 XML 解析器对 XML 文档进行剖析,而后应用程序通过 XML 解析器所提供的 DOM 接口或者 SAX 接口对剖析后果进行操作,从而间接地实现了对 XML 文档的拜访!
7. Java 解析 XML
xml 文档中的数据
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<china>
<guangzhou > 广州 </guangzhou>
<shenzhen> 深圳 </shenzhen>
<beijing> 北京 </beijing>
<shanghai> 上海 </shanghai>
</china>
7.1 DOM 解析
7.1.1 遍历
public class Main{public static void main(String[] args) throws ParserConfigurationException , IOException, SAXException {
//API 标准:须要用一个工厂来造解析器对象,先造了一个工厂
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 获取解析器对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析 XML 文档,失去了代表 XML 文档的 Document 对象!Document document = documentBuilder.parse(new File("test.xml"));
list(document);
}
private 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 child = nodelist.item(i);
list(child);
}
}
}
/*
Output:
china
guangzhou
shenzhen
beijing
shanghai
*/
7.1.2 查问
private static void read(Document document){NodeList nodelist = document.getElementsByTagName("a");
Node node = nodelist.item(0);
String value = node.getTextContent();
System.out.println(value);
}
/*
Output:
广州
*/
7.1.3 减少
减少到 XML 文档中的最初
private static void add(Document document) throws TransformerException {
// 创立须要减少的节点
Element element = document.createElement("hangzhou");
// 向节点增加文本内容
element.setTextContent("杭州");
// 失去须要增加节点的父节点
Node parent = document.getElementsByTagName("china").item(0);
// 把须要减少的节点挂在父节点上面去
parent.appendChild(element);
// 获取一个转换器它须要工厂来造,那么我就造一个工厂
TransformerFactory transformerFactory = TransformerFactory.newInstance();
// 获取转换器对象
Transformer transformer = transformerFactory.newTransformer();
// 把内存中的 Dom 树更新到硬盘中
transformer.transform(new DOMSource(document),new StreamResult("test.xml"));
}
减少到指定节点的前一个
private static void add2(Document document) throws TransformerException {
// 获取到 beijing 节点
Node beijing = document.getElementsByTagName("beijing").item(0);
// 创立新的节点
Element element = document.createElement("guangxi");
// 设置节点的文本内容
element.setTextContent("广西");
// 获取到要创立节点的父节点,Node parent = document.getElementsByTagName("china").item(0);
// 将 guangxi 节点插入到 beijing 节点之前!parent.insertBefore(element, beijing);
// 将内存中的 Dom 树更新到硬盘文件中
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("city.xml"));
}
7.1.4 删除
private static void delete(Document document) throws TransformerException {
// 获取到 beijing 这个节点
Node node = document.getElementsByTagName("beijing").item(0);
// 获取到父节点,而后通过父节点把本人删除了
node.getParentNode().removeChild(node);
// 把内存中的 Dom 树更新到硬盘文件中
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new StreamResult("test.xml"));
}
7.1.5 批改
private static void updata(Document document) throws TransformerException {
// 获取到广州的结点
Node node = document.getElementsByTagName("guangzhou").item(0);
node.setTextContent("广州你好");
// 将内存中的 Dom 树更新到硬盘文件中
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new StreamResult("test.xml"));
}
7.1.6 操作属性
private static void updataAttribute(Document document) throws TransformerException {
// 获取到 guangzhou 节点
Node node = document.getElementsByTagName("guangzhou").item(0);
// 当初 node 节点没有减少属性的办法,所以我就要找它的子类 ---Element
Element guangzhou = (Element) node;
guangzhou.setAttribute("play","gzchanglong");
// 如果要删除属性就用 removeAttribute()办法
// 将内存中的 Dom 树更新到硬盘文件中
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new StreamResult("test.xml"));
}
7.2 dom4j 解析
须要导入开发包
7.2.1 为什么要有 dom4j?
dom 毛病:比拟消耗内存
sax 毛病:只能对 xml 文件进行读取, 不能批改, 增加, 删除
dom4j:既能够提高效率, 同时也能够进行 crud 操作
7.2.2 获取 Document 对象
①:读取 XML 文件, 取得 document 对象(这种最罕用)
SAXReader reader = new SAXReader();Document document = reader.read(new File("input.xml"));
②:解析 XML 模式的文本, 失去 document 对象
String text = "<members></members>";
Document document=DocumentHelper.parseText(text);
③:被动创立 document 对象.
Document document =DocumentHelper.createDocument();
// 创立根节点
Element root = document.addElement("members");
7.2.3 查问
XML 文件
<?xml version="1.0" encoding="UTF-8" ?>
<person>
<name littleName="zk">xzk</name>
<age>20</age>
</person>
个别查问
public void read() throws DocumentException {
// 获取到解析器
SAXReader saxReader = new SAXReader();
// 获取到 XML 文件的流对象
InputStream inputStream = dom4j11.class.getClassLoader().getResourceAsStream("1.xml");
// 通过解析器读取 XML 文件
Document document = saxReader.read(inputStream);
// 获取失去根节点
Element root = document.getRootElement();
// 获取失去 name 节点
Element name = root.element("name");
// 失去了 name 节点,就能够获取 name 节点的属性或者文本内容了!String text = name.getText();
String attribute = name.attributeValue("littleName");
System.out.println("文本内容是:" + text);
System.out.println("属性内容是:" + attribute);
}
/*
Output:
文本内容是:xzk
属性内容是:zk
*/
多层构造的查问
// 获取失去根节点
Element root = document.getRootElement();
// 一层一层地获取到节点
Element element = root.element("guangdong").element("guangzhou").element("luogang");
String value = element.getText();
System.out.println(value);
7.2.4 减少
public void add() throws Exception {
// 获取到解析器
SAXReader saxReader = new SAXReader();
// 获取到 XML 文件的流对象
InputStream inputStream = dom4j11.class.getClassLoader().getResourceAsStream("1.xml");
// 通过解析器读取 XML 文件
Document document = saxReader.read(inputStream);
// 创立出新的节点,为节点设置文本内容
Element newElement = DocumentHelper.createElement("name");
newElement.setText("ouzicheng");
// 获取到根元素
Element root = document.getRootElement();
// 把新创建的 name 节点挂在根节点上面
root.add(newElement);
// 创立带有格局的对象
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
// 设置编码,默认的编码是 gb2312,读写的编码不统一,会导致乱码的!outputFormat.setEncoding("UTF-8");
// 创立 XMLWriter 对象
XMLWriter xmlWriter = new XMLWriter(new FileWriter("2.xml"), outputFormat);
//XMLWriter 对象写入的是 document
xmlWriter.write(document);
// 敞开流
xmlWriter.close();}
在指定的地位减少节点
// 创立一个新节点
Element element = DocumentHelper.createElement("name");
element.setText("ouzciheng");
// 获取失去 person 下所有的节点元素!List list = document.getRootElement().elements();
// 将节点增加到指定的地位上
list.add(1, element);
7.2.5 批改
// 获取失去 age 元素
Element age = document.getRootElement().element("age");
age.setText("9999");
XMLWriter 和获取 Document 对象的代码和后面的都是一样的
7.2.6 删除
// 获取失去 age 节点
Element age = document.getRootElement().element("age");
// 失去 age 节点的父节点,应用父节点的 remove 删除 age 节点!age.getParent().remove(age);
XMLWriter 和获取 Document 对象的代码和后面的都是一样的
最初
感激你看到这里,看完有什么的不懂的能够在评论区问我,感觉文章对你有帮忙的话记得给我点个赞,每天都会分享 java 相干技术文章或行业资讯,欢送大家关注和转发文章!