@MRsunhuimin
2020-09-07T14:45:44.000000Z
字数 7421
阅读 210
java基础
1. XML指可扩展标记语言(EXtensible Markup Language)。
2. XML是一种标记语言,很类似HTML(超文本标记语言)。
3. XML的设计宗旨是传输数据,而非显示数据。
4. XML标签没有被预定义。您需要自行定义标签。
5. XML被设计为具有自我描述性。
6. XML是 W3C 的推荐标准。
XML文档内容由一系列标签元素组成
格式:<元素名 属性名=“属性值”>元素内容</元素名>
属性值用双引号包裹
一个元素可以有多个属性
属性值中不能直接包含<、“、&
不建议使用的字符:‘、>
空元素:
<name> </name>
<name></name>
<name/>
1. 声明一个xml文件
<?xml version="1.0" encoding="utf-8"?>
2. 文档节点部分
<节点名></节点名>
节点/元素/标签一个意思
标签属性,区分大小写,默认全小写
或者作为单标签,自闭和<br />
3. 整个文档只能有一个根节点
如<root><a></a></root>对
<root></root><a></a>错
4. 标签可以嵌套,但不可以互嵌套
<root><a></root></a>
5. 属性写法
属性必有值,推荐小写,必须双引号括住
html中
<input type="text" disabled>
<select>
<option>大</option>
<option selected>小</option>
<option>中</option>
</select>
----<option selected="selected">小</option>--
6. 注释的写法
<!---这是注释---->
7.特殊字符要用实体来表示(转义)
'->'
"->"
>->>
&-><
7. 如果文章中有大量'"<>
定界符CDATA来放大段文本时不考虑
<![CDATA[内容]]>
8. 一切皆节点,包括,空格,换行,注释
1. 所有XML元素都必须有结束标签
2. XML标签对大小写敏感
3. XML必须正确的嵌套
4. 同级标签以缩进对齐
5. 元素名称可以包含字母、数字或其他的字符
6. 元素名称不能以数字或者标点符号开始
7. 元素名称中不能含空格
1. XML是用来存放数据的
2. XML不是HTML的替代品,XML和HTML是两种不同用途的语言。
3. XML是被设计用来描述数据的,重点是:什么是数据,如何存放数据。
4. HTML是被设计用来显示数据的,重点是:显示数据以及如何显示数据更好上面。
1. 非验证解析器
作用:检查文档格式是否良好
2. 验证解析器
作用:使用DTD检查文档的有效性
用于解决在复杂、大型XML文件中,出现名称相同,但是含义不同的元素
文档对象模型(Document Object Model)
DOM把XML文档映射成一个倒挂的树
DOM解析包:org.w3c.dom
获得TransformerFactory对象
创建Transformer对象
创建DOMSource对象
包含XML信息
设置输出属性
编码格式
创建StreamResult对象
包含保存文件的信息
将XML保存到指定文件中
1. 给所有的Brand标签添加id属性
获取Brand标签
调用setAttribute()方法添加属性
2. 删除Brand值为“华为”的标签
getElementsByTagName()方法获取Brand标签列表
获得Brand值为“华为”的标签对象
通过getParentNode()方法获得父节点对象
调用父节点的removeChild()方法删除节点
1. 基于XML文档树结构的解析
2. 适用于多次访问的XML文档
3. 特点:比较消耗资源
特点:
1. 基于事件的解析
2. 适用于大数据量的XML文档
3. 特点:占用资源少,内存消耗小
1. dom4j是一个Java的XML API,是dom4j.org 出品的一个开源 XML 解析包,是jdon升级版,用来读写XML文件
2. DOM4j是一个易用,开源的库,用于XML,Xpath,XSLT,它应用于Java平台,采用Java集合框架并完全支持DOM,SAX和JAXP
3. DOM4j整合两种思想(SAX、DOM)
使用SAX的思想读取XML
使用DOM的思想,在内存中创建一颗对象关系树,可以参照之前学的DOM
4. 解析XML文档,读写XML文档主要依赖于org.dom4j.io包,其中提供两个类:
1.DOMReader
2.SAXReader
(这两个类的调用方式是一致的)
1. 非常优秀的Java XML API
2. 性能优异、功能强大
3. 开放源代码
package com.java_high.dom4j;
/*
* 节点/元素/标签一个意思
*/
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class test01 {
public static void main(String[] args) {
//将xml文件加载到内存中 XML解析器
SAXReader saxReader = new SAXReader();
try {
//document 加载执行xml文档获取Document对象
Document document = saxReader.read("src/com/java_high/dom4j/stu.xml");
//获取XML根节点getRootElement()
Element rootelement = document.getRootElement();
//获取当前节点下所有子节点 elements()——><user>
List<Element> elements = rootelement.elements();
//第一个增强for循环获取根节点下子所有节点的子节点
for (Element ele : elements) {
//list集合存储6个属性
List<Element> ele2 = ele.elements();
//增强for循环遍历
for (Element ele3 : ele2) {
//获取当前节点属性 attributeValue(“属性名”)
System.out.println(ele3.attributeValue("val"));
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<student>
<user>
<!-- 姓名 -->
<name val="张三"/>
<!-- 预计成绩 -->
<score val="80"/>
<!-- 最终成绩 -->
<score1 val="90"/>
</user>
<user>
<name val="李四"/>
<score val="70"/>
<score1 val="95"/>
</user>
</student>
package com.java_high.dom4j;
import java.io.FileWriter;
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 test02 {
public static void main(String[] args) throws Exception {
SAXReader saxReader = new SAXReader();
try {
Document doc = saxReader.read("src/com/java_high/dom4j/change.xml");
Element rootElement = doc.getRootElement();
List<Element> elements = rootElement.elements();
for (Element ele1 : elements) {
String elename = ele1.attributeValue("name");
if (elename.equals("苹果")) {
//删除
//rootElement.remove(ele1);
ele1.addAttribute("name", "小米");
}
}
OutputFormat frm = OutputFormat.createPrettyPrint();
frm.setEncoding("GBK");
FileWriter fw = new FileWriter("src/com/java_high/dom4j/change.xml");
XMLWriter xmlWriter = new XMLWriter(fw,frm);
xmlWriter.write(doc);
xmlWriter.close();
System.out.println("替换成功!");
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="GBK"?>
<PhoneInfo>
<Brand name="华为">
<Type name="U8650"/>
<Type name="HW123"/>
<Type name="HW321"/>
</Brand>
<Brand name="小米">
<Type name="iPhone4"/>
</Brand>
</PhoneInfo>
package com.java_high.dom4j;
import java.io.FileWriter;
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;
/*
* 添加新的Brand:三星
* 给Brand节点添加新的子标签Type:Note4
*/
public class test03 {
public static void main(String[] args) throws Exception {
//将xml文件加载到内存中 XML解析器
SAXReader saxReader = new SAXReader();
try {
//doc加载执行xml文档获取Document对象
Document doc = saxReader.read("src/com/java_high/dom4j/add.xml");
//获取XML根节点getRootElement()
Element rootElement = doc.getRootElement();
//在根节点下创建新节点Brand,并创建节点名和属性
Element element1 = rootElement.addElement("Brand");
element1.addAttribute("name", "三星");
//同理,在新的节点Brand下创建子节点,并创建节点名和属性
Element element2 = element1.addElement("Type");
element2.addAttribute("name", "Note4");
//添加文本内容
element2.setText("2800");
//通过OutputFormat的静态方法createPrettyPrint()创建OutputFormat对象,并设置编码集
OutputFormat frm = OutputFormat.createPrettyPrint();
frm.setEncoding("GBK");
//写入XML文件的位置,以及指定的格式
FileWriter fw = new FileWriter("src/com/java_high/dom4j/add.xml");
XMLWriter xmlWriter = new XMLWriter(fw,frm);
//开始写入XML文件 写入Document对象
xmlWriter.write(doc);
xmlWriter.close();
System.out.println("添加完成!");
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="GBK"?>
<PhoneInfo>
<Brand name="华为">
<Type name="U8650"/>
<Type name="HW123"/>
<Type name="HW321"/>
</Brand>
<Brand name="苹果">
<Type name="iPhone4"/>
</Brand>
<Brand name="三星">
<Type name="Note4">2800</Type>
</Brand>
</PhoneInfo>
package com.java_high.dom4j;
import java.io.FileWriter;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
/*
* 创建根节点和其子节点,并赋予他们属性
* 前提:需要手动创建xml文件
*/
public class test04 {
public static void main(String[] args) throws Exception {
Document doc = DocumentHelper.createDocument();
Element rootElement = doc.addElement("PhoneInfo");
Element ele1 = rootElement.addElement("Brand");
ele1.addAttribute("name", "红米");
Element ele2 = ele1.addElement("Type");
ele2.setText("Note 7 Pro");
OutputFormat frm = OutputFormat.createPrettyPrint();
frm.setEncoding("GBK");
FileWriter fw = new FileWriter("src/com/java_high/dom4j/new.xml");
XMLWriter xmlWriter = new XMLWriter(fw,frm);
xmlWriter.write(doc);
xmlWriter.close();
System.out.println("创建新的xml成功!");
}
}
<?xml version="1.0" encoding="GBK"?>
<PhoneInfo>
<Brand name="红米">
<Type>Note 7 Pro</Type>
</Brand>
</PhoneInfo>
https://www.cnblogs.com/catgatp/p/6403382.html
被<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容“<”。
此标记用于xml文档中,我们先来看看使用转义符的情况。我们知道,在xml中,”<”、”>”、”&”等字符是不能直接存入的,否则xml语法检查时会报错,如果想在xml中使用这些符号,必须将其转义为实体,如”<”、”>”、”&”,这样才能保存进xml文档。
在使用程序读取的时候,解析器会自动将这些实体转换回”<”、”>”、”&”。举个例子:
<age> age < 30 </age>
上面这种写法会报错,应该这样写:
<age> age < 30 </age>
值得注意的是:
(1)转义序列字符之间不能有空格;
(2) 转义序列必须以”;”结束;
(3) 单独出现的”&”不会被认为是转义的开始;
(4) 区分大小写。
在XML中,需要转义的字符有:
(1)& &
(2)< <
(3)> >
(4)" "
(5)' '
但是严格来说,在XML中只有”<”和”&”是非法的,其它三个都是可以合法存在的,但是,把它们都进行转义是一个好的习惯。
不管怎么样,转义前的字符也好,转义后的字符也好,都会被xml解析器解析,为了方便起见,使用<![CDATA[]]>来包含不被xml解析器解析的内容。
但要注意的是:
(1) 此部分不能再包含”]]>”;
(2) 不允许嵌套使用;
(3)”]]>”这部分不能包含空格或者换行。
最后,说说<![CDATA[]]>和xml转移字符的关系,它们两个看起来是不是感觉功能重复了?
是的,它们的功能就是一样的,只是应用场景和需求有些不同:
(1)<![CDATA[]]>不能适用所有情况,转义字符可以;
(2) 对于短字符串<![CDATA[]]>写起来啰嗦,对于长字符串转义字符写起来可读性差;
(3) <![CDATA[]]>表示xml解析器忽略解析,所以更快。