xml文件使用及解析

简介: 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&lt;tm&gt;</name>

常见的特殊字符如下:

字符 表示
< &lt;
> &gt;
& &amp;
" &quot;
' &apos;

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

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

  • 根元素必须是book
  • book元素必须包含nameauthor等指定元素
  • 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树

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

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

也可以使用dom4j生成xml文件

或者

结果

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);
                }

更多jsoup参考文章

Jsoup-CSDN博客

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如何自定义解析


相关文章
|
9天前
|
存储 Java API
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
48 0
|
9天前
|
XML 数据格式
小米备份descript.xml文件
小米备份descript.xml文件
13 0
|
4天前
|
移动开发 数据可视化 Linux
Linux 中的文件与目录管理解析
当谈到Linux系统,文件与目录管理是其中最基本和重要的部分之一。Linux提供了一种强大而灵活的方式来组织和管理文件和目录,让用户能够轻松地访问和操作系统中的各种数据。上一节我们说到文件的属性,本文将详细介绍Linux中的文件与目录管理的各个方面。
|
4天前
|
Linux Go 数据安全/隐私保护
Linux 中的文件属性解析
在 Linux 系统中,每个文件和目录有一组属性控制其操作和访问权限。了解这些属性对有效管理文件至关重要。文件属性包括:文件类型(如 `-` 表示普通文件,`d` 表示目录),权限(如 `rwx` 表示所有者权限,`r-x` 表示组和其他用户权限),所有者,组,硬链接数,文件大小和最后修改时间。通过 `chown` 和 `chmod` 命令可更改文件所有者、所属组及权限。此外,还有特殊权限(如 SUID、SGID)和 ACL(访问控制列表)提供更精细的访问控制。
|
4天前
|
XML 存储 数据格式
探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义
DTD(文档类型定义)用于定义XML文档的结构和合法元素、属性。它允许不同团体就数据交换标准达成一致,并用于验证XML数据的有效性。DTD可通过内部声明(在XML文档内)或外部声明(在单独文件中)来定义。内部声明示例显示了如何定义`note`元素及其子元素的结构,而外部声明则引用外部DTD文件。元素、属性、实体和PCDATA/CDATA是XML构建模块。DTD中,元素通过ELEMENT声明定义,属性通过ATTLIST声明定义,实体声明提供特殊字符或外部资源的快捷方式。
8 0
|
8天前
|
XML Java 数据库连接
Javaweb之Mybatis的XML配置文件的详细解析
Javaweb之Mybatis的XML配置文件的详细解析
13 0
|
12天前
|
XML C# 数据格式
C# 解析XML文件
C# 解析XML文件
18 1
|
20天前
|
XML Java 数据库连接
mybatis中在xml文件中通用查询结果列如何使用
mybatis中在xml文件中通用查询结果列如何使用
20 0
|
2月前
|
XML 关系型数据库 MySQL
【Mysql】有关数据库中一对多/一对一,多对一xml中文件映射问题
【Mysql】有关数据库中一对多/一对一,多对一xml中文件映射问题
12 0

推荐镜像

更多