xml基本组成+约束+解析

网友投稿 278 2022-11-02


xml基本组成+约束+解析

XML:主要用来存储数据

. XML的作用

xml的格式必须规范

包含版本,和字符集编码

zhangsan 23 male
lisi 24 female

每个浏览器都有xml的解析引擎,直接把xml放入浏览器中就可以了,如果成功的话,就是下面的这种情况

CDATA区

在该区域中的数据会被原样展示,

因为在xml中有一些特殊字符,像 “<” 和 “&” 字符在 XML 元素中都是非法的。

转义字符:

“<” 会产生错误,因为解析器会把该字符解释为新元素的开始。

“&” 会产生错误,因为解析器会把该字符解释为字符实体的开始 为了让他们能够原样展示,将这些放到CDATA区格式:

XML约束

因为xml是可以自定义的也就是可以随便写的,所以当对应的框架要解析xml的时候不知道怎么解析,这个时候来了个说明文档就是XML约束 现在有两种约束技术 1.DTD:一种简单的约束技术 2. Schema:一种复杂的约束技术

1.引入DTD约束

将dtd文件复制到项目的文件夹下

student.dtd文件约束如下,这个约束是可以更加的需要自己修改成自己想要的,这只是举个例子

然后在项目创建一个XML文件,需要引入dtd约束 本地: 这里的根标签是students ,dtd文件的位置直接是student.dtd 及下图,这样引入就可以了

下面就可以写xml里面的内容和属性了。。。。

2.Schema约束

一种更牛逼的约束,约束能力更强,更严格 后缀为.xsd文件。

XML解析

解析:就是获取XML文件的内容,获取节点名,节点值,属性名,属性值 .将文档中的数据读取到内存中解析的目标是,在解析之后,java程序能够得到xml文件的所有数据.和内容 解析方式分两种:一般在服务器端用的是DOM树解析,在移动端用的是SAX解析的方法

1.DOM:

将标记语言文档一次性加载进内存,在内存中形成一颗dom树

*优点:操作方便,可以对文档进行CRUD的所有操作

* 缺点:占内存

2.SAX

逐行读取,基于事件驱动的。来个指针,读一行,释放一行 优点:不占内存。 * 缺点:只能读取,不能增删改

xml常见的解析器:

1. JAXP:sun公司提供的解析器,支持dom和sax两种思想 2. DOM4J:一款非常优秀的解析器 3. Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。 4. PULL:Android操作系统内置的解析器,sax方式的。

Jsoup 主要是用来解析出document对象,解析出DOM树 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。 步骤:

tom 18 male laji 18 fmale

创建demo.java来解析xml,获得里面的资源

import org.jsoup.Jsoup;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import java.io.File;import java.io.IOException;public class demo { public static void main(String[] args) throws IOException { //2获取document对象 //2.1获取xml文件的路径path String path = demo.class.getClassLoader().getResource("b.xml").getPath(); //2.2解析xml文档,加载文档进内存.获取DOM树-生成document对象 org.jsoup.nodes.Document document1 = Jsoup.parse(new File(path), "utf-8"); //3.获取元素对象 Element Elements elements = document1.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); Element element1 = elements.get(1); String name1 = element1.text(); System.out.println(name1); }}

Jsoup中的一些对象

Jsoup对象 工具类,可以解析html或xml文档,返回Document * parse:解析html或xml文档,返回Document 有很多的重载方法 * parse​(File in, String charsetName):解析xml或html文件的。 * parse​(String html):解析xml或html字符串 * * parse​(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象 例如第二个方法的测试如下

import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import java.io.IOException;public class demo { public static void main(String[] args) throws IOException { String str="\n" + "\n" + "\n" + "\n" + "\n" + " tom\n" + " 18\n" + " male\n" + "\n" + "\n" + "\n" + "\n" + " laji\n" + " 18\n" + " fmale\n" + "\n" + "\n" + ""; Document document = Jsoup.parse(str); System.out.println(document); }}

输出结果如下图

**Document对象**:**文档对象。代表内存中的dom树** * 获取Element对象 * getElementById(String id):根据id属性值获取唯一的element对象 * getElementsByTag(String tagName):根据标签名称获取元素对象集合 * getElementsByAttribute(String key):根据属性名称获取元素对象集合 * getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合 Elements:元素Element对象的集合。可以当做 ArrayList来使用**Element:**元素对象 1. 获取子元素对象 * getElementById(String id):根据id属性值获取唯一的element对象 * getElementsByTag(String tagName):根据标签名称获取元素对象集合 * getElementsByAttribute(String key):根据属性名称获取元素对象集合 * getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合 2. 获取属性值 * String attr(String key):根据属性名称获取属性值 3. 获取文本内容 * String text():获取文本内容 * String html():获取标签体的所有内容(包括字标签的字符串内容) 5. Node:节点对象 是上面对象的爹 * 是Document和Element的父类

Jsoup特色快捷查询方式

selector:选择器* 使用的方法:Elements select​(String cssQuery)* 语法:参考Selector类中定义的语法*2.XPath查询:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言

XPath

​​xpath教程​​ 在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 jxNodes = jxDocument.selN("//student"); for (JXNode jxNode : jxNodes) { System.out.println(jxNode); } System.out.println("--------------------"); //4.2查询所有student标签下的name标签 List jxNodes2 = jxDocument.selN("//student/name"); for (JXNode jxNode : jxNodes2) { System.out.println(jxNode); } System.out.println("--------------------"); //4.3查询student标签下带有id属性的name标签 List 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 jxNodes4 = jxDocument.selN("//student/name[@id='itcast']"); for (JXNode jxNode : jxNodes4) { System.out.println(jxNode); }


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:RTK-Mannual-4 Models and Algorithms
下一篇:SpringBoot 文件或图片上传与下载功能的实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~