xml文件使用及解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析DNS,个人版 1个月
云解析 DNS,旗舰版 1个月
简介: 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如何自定义解析


相关文章
|
1天前
|
XML Web App开发 JavaScript
XML DOM 解析器
Most browsers have a built-in XML parser that converts XML into a JavaScript accessible object (XML DOM).
|
1天前
|
XML Web App开发 JavaScript
XML DOM 解析器
解析器把 XML 转换为 JavaScript 可存取的对象(XML DOM)。
|
4天前
|
XML Web App开发 JavaScript
XML DOM 解析器
大多数浏览器内置XML解析器,将XML转化为JavaScript可访问的XML DOM对象。XML DOM提供遍历、访问、插入和删除节点的功能。文档须先加载至DOM。示例代码通过XMLHTTP请求加载`books.xml`,兼容多种浏览器,响应设置为XML DOM用于后续处理。
|
5天前
|
XML Web App开发 JavaScript
XML DOM 解析器
**XML DOM解析器将XML转换为JS对象,便于操作。浏览器内置XML解析器,通过XMLHttpRequest或ActiveXObject加载XML如&quot;books.xml&quot;。
|
2天前
|
XML Web App开发 JavaScript
XML DOM 解析器
Most browsers have a built-in XML parser to create an XML DOM object from XML, making it accessible via JavaScript. The XML DOM includes methods for navigating, accessing, inserting, and deleting nodes in the XML tree.
|
1月前
|
XML Java 数据格式
java创建xml文件内容
java创建xml文件内容
19 0
|
1月前
|
XML Java 数据格式
java解析xml文件内容
java解析xml文件内容
27 0
|
27天前
|
XML Java 数据库
配置applicationContext.xml文件
配置applicationContext.xml文件
|
25天前
|
XML Java 数据库
配置applicationContext.xml文件
配置applicationContext.xml文件
|
27天前
|
XML JavaScript Java
解析XML文件的几种方法
解析XML文件的几种方法

推荐镜像

更多