XML
来源:互联网 发布:jamp软件的作用 编辑:程序博客网 时间:2024/06/01 07:44
1、简介
XML,eXtendsible Markup Language。可扩展标记语言
由W3C组织发布,目前推荐遵守的是W3C组织于2000年发布的XML1.0规范
XML主要用来传输和存储数据
特点:
没有预定义标签,都是自定义标签
2、语法规则
⑴ XML声明要么不写,要写就要写在第一行,并且前面不能有任何字符
⑵ 严格区分大小写
⑶ 标签不能以数字开头
⑷ 属性必须有值,且必须用引号引起来
⑸ 只能有一个根标签
⑹ 标签必须正确地结束
⑺ 标签不能交叉嵌套
⑻ 注释不能嵌套
3、HelloWorld
<?xml version="1.0" encoding="UTF-8"?><books> <book id="1"> <![CDATA[<b>最好的侦探小说!</b>]]> <name>福尔摩斯探案集</name> <author>柯南·道尔</author> <price>100</price> </book> <!-- 这里是注释 --> <book id="2"> <name>解忧杂货店</name> <author>东野圭吾</author> <price>27.2</price> </book> <book id="3"> <name>小王子</name> <author>安托万</author> <price>19.2</price> </book></books>
4、文档组成
XML声明
version:指定XML版本,属性值只有1.0
encoding:指定的字符集。告诉解析器使用什么字符集进行解码
CDATA区
当一些内容不希望XML解析器解析时,可以写在CDATA区中
格式:
<![CDATA[内容]]>
5、XML解析
概念
XML解析是指通过解析器读取XML文档,解释语法,并将文档转化为对象
Java平台同时提供了DOM和SAX两种解析技术
DOM
DOM(Document Object Model)
⑴ 需要一次性将整个XML文档加载到内存中,速度较慢
⑵ 将XML转换为DOM树后,因为DOM树常驻内存,可以重复访问
⑶ 内存占用较大
⑷ 可以读取,也可以修改
⑸ 完全面向对象的解析方式,使用方便
SAX
SAX(Simple API for XML)
⑴ 顺序解析XML,不会将整个XML文档都加载到内存中。速度快
⑵ 已经解析过的XML文档,如果没有保存,将不能获得。除非重新解析
⑶ 内存占用低
⑷ 只能读取,不能修改
⑸ 通过事件的回调函数解析XML,略复杂
6、dom4j
概念
dom4j,是一个非常优秀的Java XML API,功能强大,使用方便
使用dom4j开发,需要导入dom4j-1.6.1.jar包
⑴ 解析XML
① 创建解析器对象
② 解析XML,获取Document对象
③ 获取根元素
④ 根据子元素的属性,位置来获取对应的元素
相关方法
public SAXReader() {}
创建解析器对象
public Document read(String systemId) throws DocumentException {}
获取Document对象。需要将XML的路径传入
Element getRootElement();
获取根元素
List elements(String name);
根据标签名,获取多个子元素
String attributeValue(String name);
根据属性名,获取属性值
Element element(String name);
根据标签名,获取单个子元素
String getText();
获取元素的内容
String elementText(String name);
根据标签名,获取元素的内容
使用示例
【Book】
首先需要封装一个JaveBean。属性值String类型,对应XML中的Book的子元素名。提供有参构造,并重写toString方法
【测试类】
import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import com.test.bean.Book;public class Dom4JTest { public static void main(String[] args) throws DocumentException { // 创建解析器对象 SAXReader reader = new SAXReader(); // 获取Document对象 Document document = reader.read("books.xml"); // 获取根元素 Element rootEle = document.getRootElement(); // 根据标签名,获取多个子元素 List<Element> childEles = rootEle.elements("book"); int size = childEles.size(); for (int i = 0; i < size; i++) { Element childEle = childEles.get(i); // 获取属性值 String id = childEle.attributeValue("id"); // System.out.println(id); // 根据标签名,获取单个子元素 Element nameEle = childEle.element("name"); // 获取元素的内容 String name = nameEle.getText(); // System.out.println(name); // 根据标签名,获取元素的内容 String author = childEle.elementText("author"); // System.out.println(author); String price = childEle.elementText("price"); // System.out.println(price); // 将每个属性值封装到JavaBean的实例中 Book book = new Book(id, name, author, price); // 打印该对象 System.out.println(book); } }}
⑵ 新建XML
① 新建一个XML格式
② 创建XMLWriter对象
③ 创建Document对象
④ 添加一个一个的元素
⑤ 将元素写到文件中
⑥ 关闭XMLWriter流
相关方法
public static OutputFormat createPrettyPrint() {}
新建一个良好的XML格式。静态方法,通过OutputFormat来调用
Tips:通过该方法创建的XML格式,会将每个元素分行,并且上下级元素会有2个空格的缩进
public XMLWriter(OutputStream out, OutputFormat format)
throws UnsupportedEncodingException {}
创建一个XMLWriter对象,用于输出XML。第一个参数OutputStream为一个输出流,第二个参数OutputFormat即创建的XML格式
public static Document createDocument() {}
创建Document对象。静态方法,通过DocumentHelper来调用
Element addElement(String name);
添加子元素。通过Document或Element对象来调用
Element addAttribute(String name, String value);
给元素添加属性
Element addText(String text);
给元素添加内容
public void write(Document doc) throws IOException {}
将Document对象写入到文件中。通过XMLWriter对象,只需传入Document对象,即可将Document对象里的所有子元素都输出到文件中
public void close() throws IOException {}
关闭输出流。通过XMLWriter对象来调用
使用示例
【测试类】
// 创建良好的XML风格 OutputFormat format = OutputFormat.createPrettyPrint(); // 创建XMLWriter对象 XMLWriter writer = new XMLWriter(new FileOutputStream("test.xml"), format); // 创建Document对象 Document document = DocumentHelper.createDocument(); // 创建根元素 Element rootEle = document.addElement("persons"); // 创建一个子元素 Element p1 = rootEle.addElement("person"); // 添加属性 p1.addAttribute("id", "1"); // 添加子元素的子节点 Element name1Ele = p1.addElement("name"); // 添加元素内容 name1Ele.addText("张三"); Element age1Ele = p1.addElement("age"); age1Ele.addText("14"); // 创建另一个子元素 Element p2 = rootEle.addElement("person"); p2.addAttribute("id", "2"); Element name2Ele = p2.addElement("name"); name2Ele.addText("李四"); Element age2Ele = p2.addElement("age"); age2Ele.addText("16"); // 将所有的元素写入到文件中 writer.write(document); // 关闭流 writer.close();
【输出结果】
<?xml version="1.0" encoding="UTF-8"?><persons> <person id="1"> <name>张三</name> <age>14</age> </person> <person id="2"> <name>李四</name> <age>16</age> </person></persons>
7、XPath
概念
XPath是在XML文档中查找信息的语言。其通过元素和属性进行查找,是W3C组织发布的标准
使用XPath,需要导入jaxen-1.1-beta-6.jar包
语法
⑴ 绝对定位
/标签名
示例:/books/book
选择books的所有book子元素
⑵ 相对定位
//标签名
示例://book
选择所有的book元素
⑶ 查找有属性的元素
//标签名[@属性名]
示例://book[@id]
选择所有的有id属性的book元素
⑷ 查找特定的属性值的元素
//标签名[@属性名='属性值']
示例://book[@id=’1’]
选择id等于1的book元素
在dom4j中使用XPath
⑴ 导入jar包
⑵ 调用相关的方法
相关方法
List selectNodes(String xpathExpression);
选择符合条件的所有的元素。返回一个保存了所有的Node对象的List集合
Node selectSingleNode(String xpathExpression);
选择符合条件的单个元素。返回一个Node对象
Tips:Node是Element的祖先
所以可以将得到的Node对象,向下转型为Element对象,以便调用Element的方法
使用示例
【测试类】
import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;public class XPathTest { public static void main(String[] args) throws DocumentException { SAXReader reader = new SAXReader(); Document document = reader.read("books.xml"); List<Node> selectNodes = document.selectNodes("/books/book"); System.out.println("/books/book 选择的:" + selectNodes.size() + "个"); selectNodes = document.selectNodes("//book"); System.out.println("//book 选择的:" + selectNodes.size() + "个"); selectNodes = document.selectNodes("//book[@id]"); System.out.println("//book[@id] 选择的:" + selectNodes.size() + "个"); Element idEle = (Element) document.selectSingleNode("//book[@id='1']"); String name = idEle.elementText("name"); System.out.println(name); }}
【输出结果】
/books/book 选择的:3个//book 选择的:3个//book[@id] 选择的:3个福尔摩斯探案集
- XML
- XML
- XML
- XML
- xml
- xml
- XML
- XML
- XML
- xml
- xml
- XML
- XML
- xml
- xml
- xml
- XML
- XML
- .NET对象与Windows句柄(一):句柄的基本概念
- Android_UI:SearchView
- Painter's Problem POJ1681 高斯消元
- 设计模式学习笔记
- sdut-离散题目5
- XML
- linux下的CSV文件操作
- MinPathSum(leetcode)
- 9. Palindrome Number
- pycharm注册
- sdut-离散题目6
- AMD 和 CMD 的区别有哪些?
- oracle 与 SQL server区别 实例 数据库 表空间
- redis持久化RDB和AOF