0
点赞
收藏
分享

微信扫一扫

xml文件使用及解析


一、概述

1、介绍

Xml和html都是一种标记语言,但是xml是可扩展的标记语言,之所以是可扩展的,对于html所有的标记比如,<a>表示一个连接。都是有一定含义的,不能自己定义一些标签,但是xml就可以自定义一些标签。用于传输数据


<?xml version="1.0" encoding="UTF-8"?> <!--上面一句是xml文档说明 必须放在第一行--> <!--每一个xml都有一个根标签包含子标签 并且却分大小写--> <goodlist> <!--每个子标签有自己的属性 比如id属性--> <good id="111"> <name>apple</name> <place>beijing</place> </good> <good> <name>banana</name> <place>shanghei</place> </good> </goodlist>


2、特点

XML有几个特点:一是纯文本,默认使用UTF-8编码,二是可嵌套,适合表示结构化数据。如果把XML内容存为文件,那么它就是一个XML文件

3、结构

XML有固定的结构,首行必定是​​<?xml version="1.0"?>​​​,可以加上可选的编码。紧接着,如果以类似​​<!DOCTYPE note SYSTEM "book.dtd">​​​声明的是文档定义类型(DTD:Document Type Definition),DTD是可选的。接下来是XML的文档内容,一个XML文档有且仅有一个根元素,根元素可以包含任意个子元素,元素可以包含属性,例如,​​<isbn lang="CN">1234567</isbn>​​​包含一个属性​​lang="CN"​​​,且元素必须正确嵌套。如果是空元素,可以用​​<tag/>​​表示。

由于使用了​​<​​​、​​>​​​以及引号等标识符,如果内容出现了特殊符号,需要使用​​&???;​​​表示转义。例如,​​Java<tm>​​必须写成:

<name>Java<tm></name>

常见的特殊字符如下:

字符

表示

<

&lt;

>

&gt;

&

&amp;

"

&quot;

'

&apos;

格式正确的XML(Well Formed)是指XML的格式是正确的,可以被解析器正常读取。而合法的XML是指,不但XML格式正确,而且它的数据结构可以被DTD或者XSD验证。

DTD文档可以指定一系列规则,例如:

  • 根元素必须是​​book​
  • ​book​​​元素必须包含​​name​​​,​​author​​等指定元素
  • ​isbn​​​元素必须包含属性​​lang​
  • ...

如何验证XML文件的正确性呢?最简单的方式是通过浏览器验证。可以直接把XML文件拖拽到浏览器窗口,如果格式错误,浏览器会报错。

和结构类似的HTML不同,浏览器对HTML有一定的“容错性”,缺少关闭标签也可以被解析,但XML要求严格的格式,任何没有正确嵌套的标签都会导致错误。

XML是一个技术体系,除了我们经常用到的XML文档本身外,XML还支持:

  • DTD和XSD:验证XML结构和数据是否有效;
  • Namespace:XML节点和属性的名字空间;
  • XSLT:把XML转化为另一种文本;
  • XPath:一种XML节点查询语言;
  • ...

实际上,XML的这些相关技术实现起来非常复杂,在实际应用中很少用到,通常了解一下就可以了。

二、约束文件

平时编写的xml文件,没有固定的规则,标签名 属性名 属性值可以随意定义,但是如果想让别人在使用自己xml文件的使用,不能随意定义相关标签,就要在这个xml文件中加入约束文件,常见的约束文件有两DTD(文件名后缀是dtd)和schema(文件名后缀是xsd)两种,相比较而言,schema约束文件更加高级全面。DTD约束和schema约束(干的是同样的事情 只不过功能强大不同)

位置

内部dtd

外部dtd

三、解析

概述

1. JAXP:sun公司提供的解析器,支持dom和sax两种思想

2. DOM4J:一款非常优秀的解析器

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

4. PULL:Android操作系统内置的解析器,sax方式的。

DOM4J解析

方式是dom方式,把xml文件加载到内存中形成一个dom树

xml文件使用及解析_前端

xml文件使用及解析_java_02

xml文件使用及解析_前端_03

并得到一个document对象。可以使用dom4j进行dom方式的解析

将Dom4j的jar包放在工程根目录当中创建一个文件夹为lib(javase工程);web工程直接放到WEB-INF中的lib文件

xml文件使用及解析_servlet_04

也可以使用dom4j生成xml文件

xml文件使用及解析_html_05

或者

xml文件使用及解析_servlet_06

结果

xml文件使用及解析_html_07

xml文件使用及解析_java_08

jsoup 解析

概述

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

* 步骤:

      1. 导入jar包

      2. 获取Document对象

      3. 获取对应的标签Element对象

      4. 获取数据

案例代码

//获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//解析xml文档,加载文档进内存,获取dom树--->Document
Document document = Jsoup.parse(new File(path), "utf-8");
//获取元素对象 Element
Elements elements = document.getElementsByTag("name");

System.out.println(elements.size());
//获取第一个name的Element对象
Element element = elements.get(0);
//获取数据
String name = element.text();
System.out.println(name);


使用文档

1. 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的文档对象

2. Document:文档对象。代表内存中的dom树
* 获取Element对象
* getElementById(String id):根据id属性值获取唯一的element对象
* getElementsByTag(String tagName):根据标签名称获取元素对象集合
* getElementsByAttribute(String key):根据属性名称获取元素对象集合
* getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合

3. Elements:元素Element对象的集合。可以当做 ArrayList<Element>来使用

4. Element:元素对象

获取子元素对象
* getElementById(String id):根据id属性值获取唯一的element对象
* getElementsByTag(String tagName):根据标签名称获取元素对象集合
* getElementsByAttribute(String key):根据属性名称获取元素对象集合
* getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合

获取属性值
* String attr(String key):根据属性名称获取属性值

获取文本内容
* String text():获取文本内容
* String html():获取标签体的所有内容(包括字标签的字符串内容)

5. Node:节点对象
* 是Document和Element的父类

*6.快捷查询方式

selector:选择器
* 使用的方法:Elements   select(String cssQuery)

* 语法:参考Selector类中定义的语法

XPathXPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
* 使用Jsoup的Xpath需要额外导入jar包。
* 查询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);

结合xpath语法查询

//查询所有student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
System.out.println("--------------------");

//查询所有student标签下的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
System.out.println("--------------------");

//查询student标签下带有id属性的name标签
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
System.out.println("--------------------");

//查询student标签下带有id属性的name标签 并且id属性值为itcast
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
for (JXNode jxNode : jxNodes4) {
System.out.println(jxNode);
}

 Jackson解析

如果能直接从XML文档解析成一个JavaBean,那比DOM或者SAX不知道容易到哪里去了。

幸运的是,一个名叫Jackson的开源的第三方库可以轻松做到XML到JavaBean的转换。我们要使用Jackson,先添加两个Maven的依赖:

  • com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.10.1
  • org.codehaus.woodstox:woodstox-core-asl:4.4.1

然后,定义好JavaBean,就可以用下面几行代码解析:

InputStream input = Main.class.getResourceAsStream("/book.xml");
JacksonXmlModule module = new JacksonXmlModule();
XmlMapper mapper = new XmlMapper(module);
Book book = mapper.readValue(input, Book.class);
System.out.println(book.id);
System.out.println(book.name);
System.out.println(book.author);
System.out.println(book.isbn);
System.out.println(book.tags);
System.out.println(book.pubDate);

注意到​​XmlMapper​​​就是我们需要创建的核心对象,可以用​​readValue(InputStream, Class)​​直接读取XML并返回一个JavaBean。运行上述代码,就可以直接从Book对象中拿到数据:

1
Java核心技术
Cay S. Horstmann
1234567
[Java, Network]
null

如果要解析的数据格式不是Jackson内置的标准格式,那么需要编写一点额外的扩展来告诉Jackson如何自定义解析

举报

相关推荐

0 条评论