XML解析

XML:

1、概念

  • Extensible Markup Language 可扩展标记语言。
    • 可扩展:标签都是自定义的。例如:
    • 功能:存储数据、充当配置文件、网络中数据传输
    • XML与HTML的区别
      1、xml标签都是自定义的,html标签是预定义。
      2、xml的语法严格,html语法松散
      3、xml是存储数据的,html是展示数据

2、语法:

  • XML文档声明

    1、文档声明必须为结束;
    2、文档声明必须从文档的0行0列位置开始;
    3、文档声明只有三个属性:
    (1)versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
    (2)encoding:指定当前文档的编码。可选属性,默认值是utf-8;
    (3)standalone:指定文档独立性。可选属性,默认值为yes,表示当前文档是独立文档。如果为no表示当前文档不是独立的文档,会依赖外部文件。

  • 元素

    1、元素是XML文档中最重要的组成部分,
    2、普通元素的结构开始标签、元素体、结束标签组成。例如:大家好
    3、元素体:元素体可以是元素,也可以是文本,例如:你好
    4、空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合,例如:
    5、元素命名:
    (1) 区分大小写
    (2) 不能使用空格,不能使用冒号:
    (3) 不建议以XML、xml、Xml开头
    6、良好的XML文档,必须有一个根元素。

  • 属性

    1、属性是元素的一部分,它必须出现在元素的开始标签中
    2、属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
    3、一个元素可以有0~N个属性,但一个元素中不能出现同名属性
    4、属性名不能使用空格、冒号等特殊字符,且必须以字母开头

  • 注释
    XML的注释与HTML相同,即以结束。注释内容会被XML解析器忽略!

3、快速入门


		
			
				zhangsan
				23
				male
				
lisi 24 female

4、约束

  • 约束:规定xml文档的书写规则

  • 分类:
    1、DTD:一种简单的约束技术
    2、Schema:一种复杂的约束技术

  • DTD:
    1、 引入dtd文档到xml文档中
    2、内部dtd:将约束规则定义在xml文档中
    3、外部dtd:将约束的规则定义在外部的dtd文件中
    4、本地:
    5、网络:

  • Schema:
    1、引入Schema约束
    2、填写xml文档的根元素
    3、引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4、引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
    5、为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml"


解析XML

1、解析
解析(读取):将文档中的数据读取到内存中
回写(写入):将内存中的数据保存到xml文档中。持久化的存储
2、解析方法
1、 DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
优点:操作方便,可以对文档进行CRUD的所有操作
缺点:占内存
XML解析_第1张图片
2、SAX:逐行读取,基于事件驱动的。
优点:不占内存。
缺点:只能读取,不能增删改

3、解析器
1、JAXP:sun公司提供的解析器,支持dom和sax两种思想
2、DOM4J:一款非常优秀的解析器
3、Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
4、 PULL:Android操作系统内置的解析器,sax方式的。
在这里插入图片描述
4、解析开发包
1、JAXP:sun公司提供支持DOM和SAX开发包
2、JDom:dom4j兄弟
3、jsoup:一种处理HTML特定解析开发包
4、dom4j:比较常用的解析开发包,hibernate底层采用。

Jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
1、 导入jar包
2、 获取Document对象
3、 获取对应的标签Element对象
4、 获取数据

 //1获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//2解析xml文档,加载文档进内存,获取dom树--->Document
Document document = Jsoup.parse(new File(path), "utf-8");
//3.获取元素对象 Element
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//3.1获取第一个name的Element对象
Element element = elements.get(0);
//3.2获取数据
String name = element.text();
System.out.println(name);

Dom4j

    //#1 获得document
	SAXReader saxReader = new SAXReader();
	Document document = saxReader.read(new File("src/cn/itcast/a_xml/web.xml"));
	
	//#2 获得根元素
	Element rootElement = document.getRootElement();
	
	//打印version属性值
	String version = rootElement.attributeValue("version");
	System.out.println(version);
	
	//#3 获得所有子元素。例如:/
	List<Element> allChildElement = rootElement.elements();
	
	//#4 遍历所有
	for (Element childElement : allChildElement) {
		// #5.1 打印元素名
		String childEleName = childElement.getName();
		System.out.println(childEleName);
		
		// #5.2 处理 ,并获得子标签的内容。例如:
		if("servlet".equals(childEleName)){
			// 方式1:获得元素对象,然后获得文本
			Element servletNameElement = childElement.element("servlet-name");
			String servletName = servletNameElement.getText();
			System.out.println("\t" + servletName);
			
			// 方式2:获得元素文本值
			String servletClass = childElement.elementText("servlet-class");
			System.out.println("\t" + servletClass);
			
		}
		
		// #5.3 处理 省略... 
		
	}

5、快捷查询方式
selector选择器
1、使用的方法:Elements select​(String cssQuery)
2、语法:参考Selector类中定义的语法
XPath
XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
1、使用Jsoup的Xpath需要额外导入jar包。
2、询w3cshool参考手册,使用xpath的语法完成查询

//1.获取student.xml的path
 String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
 //2.获取Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
 //3.根据document对象,创建JXDocument对象
 JXDocument jxDocument = new JXDocument(document);
//4.结合xpath语法查询
//4.1查询所有student标签
 List<JXNode> jxNodes = jxDocument.selN("//student");
 for (JXNode jxNode : jxNodes) {
    System.out.println(jxNode);
}
 System.out.println("--------------------");
//4.2查询所有student标签下的name标签
 List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes2) {
    System.out.println(jxNode);
}
System.out.println("--------------------");
//4.3查询student标签下带有id属性的name标签
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes3) {
    System.out.println(jxNode);
}
System.out.println("--------------------");
 //4.4查询student标签下带有id属性的name标签 并且id属性值为itcast
 List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
for (JXNode jxNode : jxNodes4) {
    System.out.println(jxNode);
}

你可能感兴趣的:(java)