XML学习笔记
Posted 马哥讲编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML学习笔记相关的知识,希望对你有一定的参考价值。
一、XML简介***
XML指的是可扩展标记语言!(特殊格式的文档)
二、XML特性***
1. 具有平台无关性!是一门独立的标记语言!
2. 具有自我描述性!大多数编程语言对XML都进行了支持(支持XML生成,XML解析) 常使用到:
3. 主要应用于网络数据的传输,以及本地数据的存储!
4. 在后期的学习中,经常使用XML进行配置文件的编写!
三、XML语法结构*
1. XML文档声明(用于描述XML版本 以及字符编码)
<?xmlversion="1.0" encoding="UTF-8"?>
2. 标记/标签/元素/节点(指的是同一个事物)
标签分为开始标签与结束标签,开始标签与结束标签之间描述标记的内容!
开始标签语法:<自定义标签名称>
结束标签语法:</自定义标签名称>
例如:使用XML标签,描述一本书的书名:
<bookname>金苹果</bookname>
3. XML文档中的标签,允许重名,允许嵌套,不允许交叉
例如描述一本书:
<book>
<name>金苹果</name>
<info>讲述了一个苹果,从青涩到金黄色的过程!</info>
</book>
4. 任何一个XML文档,都必须存在且只允许存在一个根标签!
5. 子标签,兄弟标签,后代标签,父标签以及祖先标签的概念!
案例:
<books><book>
<name>金苹果</name>
<info>讲述了一个苹果,从青涩到金黄色的过程!</info>
</book><book>
<name>红苹果</name>
<info>讲述了一个苹果,从青涩到红色的过程!</info>
</book></books>
上述的案例中:
a) name标签是book标签的子标签
b) name标签是books标签的后代标签
c) book标签是name标签的父标签
d) books标签是 name标签的 祖先标签 (也称祖先标签为间接父标签)
e) info标签 与 name标签是兄弟标签
6. 属性
在开始标签中的,标签名称后可以编写属性:
语法:
a) 属性由一个个的键值对组成,
键与值之间使用等号连接
多个键值对之间使用 空格分割
值必须使用引号引住 (单双引号都可以)
案例:
<bookid="10001" type="成人读物">
<name>红苹果</name>
<info>讲述了一个苹果,从青涩到红色的过程!</info>
</book>
7. XML文档中的注释
多行注释:
<!--注释的内容 -->
a) XML文档案例1
<?xml version="1.0"encoding="UTF-8" ?>
<books>
<book id="10001">
<name>金苹果Ⅰ</name>
<info>讲述了一个苹果,从青涩到金黄色的过程!</info>
</book>
<book id="10002">
<name>金苹果Ⅱ</name>
<info>又讲述了一个苹果,从青涩到金黄色的过程!</info>
</book>
<book id="10003">
<name>金苹果Ⅲ</name>
<info>还讲述了一个苹果,从青涩到金黄色的过程!</info>
</book>
</books>
b) XML文档案例2
<?xmlversion="1.0" encoding="UTF-8"?>
<persons>
<!-- 注释的内容-->
<person id="10001">
<name>蒋军</name>
<age>18</age>
<sex>女</sex>
</person>
</persons>
四、Java中的 XML解析
面试题:*****
问:Java中有几种XML解析方式,分别是什么? 有什么优缺点?
答:四种解析方式,分别是:
SAX解析:事件驱动机制!解析器逐行解析XML文件,解析时,当发现标签开始,标签结束,文本内容,属性等等时,会自动发送事件,通知程序员解析特定内容
缺点:事件驱动,事件过后未处理的数据会被释放!
只能通过事件来手动区分具体的节点层次!
无法修改和删除节点内容
优点:占用资源较少!
DOM解析:将整个XML文档,加载到内容,在内存中建立文档树模型
缺点:将整个文档加载到内存中,可能会加载一些无用的数据,浪费内存空间!
优点:因为整个加载到内存,可以很方便的删除,修改!
JDOM解析:属于DOM解析的扩展
DOM4J解析:属于DOM解析的扩展
DOM4J解析步骤熟练
a) 得到一个指向XML文档的输入流
FileInputStreamfis = new FileInputStream("文件路径");
InputStream is= class.getClassLoader().getResourceAsStream("src文件夹下的文件名");
b) 创建一个XML读取对象(SAXReader),用来读取输入流!
SAXReader sr = new SAXReader();
c) 通过XML读取对象,读取XML文档的输入流,得到文档对象(Document)
Document doc = sr.read(is);
d) 通过文档对象,得到文档的根元素对象(元素对象Element)
Element root = doc.getRootElement();
e) 通过根元素,得到其他所有元素
五、Element类常用操作
l 获取元素名称 String name = element.getName();
l 获取元素文本内容 String text = element.getText();
l 设置元素文本内容 element.setText(String text);
l 根据子元素名称,得到子元素 Element子元素=element.element(String子元素名);
l 获取所有的直接子元素对象 List<Element> elements= element.elements();
l 获取属性对象(Attribute) Attribute attr =element.attribute(String 属性名);
l 获取属性值 String value = element.attributeValue(String属性名);
l 直接获取子元素文本内容 String text = element.elementText(String子元素名);
六、Attribute类 了解
表示XML文档中的一个元素属性 .
包含属性名 与 属性值:
获取属性名:String name = attribute.getName();
获取属性值:String value - attribute.getValue();
七、XPATH 解析XML
通过路径方式,快速的查找一个 或一组元素!
1. 路径表达式:
/:从根节点查找节点
例如:/book 表示从根节点查找一个或多个book节点
//:从发起查找的节点,查找其后代节点
例如:在根节点使用XPATH路径 //name,则表示查找文档中的所有name节点
.:选择发起查找的节点
..:选择发起查找的节点的 父节点
@:用于在路径中 加入谓语,添加属性判断条件
2. 怎么使用路径表达式:
可以通过Node类的对象,调用方法,传入XPATH路径,得到查询后的节点:
Node:是一个接口,是Document,Element,Attribute 接口的父接口!
方法:
一次查询单个节点
Element element = node.selectSingleNode(Stirng路径);
一次查询一组节点
List<Element> elements = node.selectNodes(String路径);
案例:
//xpath查询一组
publicstatic void main(String[] args) throws Exception {
FileInputStreamfis = new FileInputStream("C:\\code\\22\\code1\\day01_XML\\src\\demo2.xml");
SAXReadersr = new SAXReader();
Documentdoc = sr.read(fis);
Stringxpath = "//age";
List<Element>elements = doc.selectNodes(xpath);
for(int i = 0; i < elements.size(); i++) {
System.out.println(elements.get(i).getText());
}
}
3. XPATH路径 谓语 了解
语法:
在路径字符串中,可以通过判断属性的方式,来限制查询的结果:
[@属性名]:必须存在某属性
[@属性名='某值']:必须存在属性,且属性值必须等于某值
[@属性名!='某值']:...
[@属性名>'xxx']:...
...
案例:
publicstatic void main(String[] args) throws Exception {
FileInputStreamfis = new FileInputStream("C:/code/22/code1/day01_XML/src/demo2.xml");
SAXReadersr = new SAXReader();
Documentdoc = sr.read(fis);
Stringxpath = "//person[@id='10002']//age";
Elemente = (Element) doc.selectSingleNode(xpath);
System.out.println(e.getText());
}
4. DOM4J 生成XML文档 了解
Node类的方法:
a) 添加节点
Elemente = node.addElement("元素名称");
b) 添加属性
node.addAttribute(String属性名,String 属性值);
步骤:
i. 通过文档帮助器(DocumetnHelper),创建一个空的文档对象(Document)
Documentdoc = DocumentHelper.createDocument();
ii. 向文档中,添加并得到根节点
Elementbooks = doc.addElement("books");
iii. 通过根节点,丰富子节点 (添加节点)
for(int i=0;i<1000;i++){
//向根节点,添加10000个子节点book
Element book = books.addElement("book");
//向book中加入属性id
book.addAttribute("id",10001+i+"");
//向book中加入name子节点
Element name = book.addElement("name");
//选项book中加入info子节点
Element info = book.addElement("info");
//丰富子节点name和info 的内容
name.setText("书名"+i);
info.setText("图书简介"+i);
}
iv. 创建一个文件字节输出流,用于输出当前的新文档对象
FileOutputStreamfos = new FileOutputStream("存储路径");
v. 将文件输出流,转换为XML输出流(XMLWriter).
XMLWriterxw = new XMLWriter(fos);
vi. 将文档输出,并释放资源
xw.write(doc);
xw.close();
八、XStream 了解
快速的将一个 Java中的对象,转换为XML格式字符串:
步骤:
创建XStream工具对象
XStream x = new XStream();
2. 替换指定类的 节点名称
x.alias("节点名",要转换的类信息);
将对象转换为XML字符串
String 字符串= x.toXML(Java对象);
以上是关于XML学习笔记的主要内容,如果未能解决你的问题,请参考以下文章