XML相关

XML概述

概念 : Extensible Markup Language 可扩展标记语言

  • 可扩展: 标签都是自定义的。 <user> <student>
  • 功能
    • 存储数据
      1. 配置文件
      2. 在网络中传输
  • xml与html的区别
    • xml标签都是自定义的,html标签是预定义。
    • xml的语法严格,html 语法松散
    • xml 是存储数据的,html是展示数据
  • w3c:万维网联盟

严格规定

  1. xml文档的后缀名 .xml
  2. xml第一行必须定义为文档声明
  3. xml文档中有且仅有一个根标签
  4. 属性值必须使用引号(单双都可)引起来
  5. 标签必须正确关闭
  6. xml标签名称区分大小写
<?xml version="1.0"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

组成部分

  1. 文档声明:

    1. 格式:<?xml 属性列表 ?>
    2. 属性列表:
      • version:版本号,必须的属性。一般为1.0版本
      • encoding:编码方式。告知解析引擎当前使用的的字符集,默认值:ISO-8859-1
      • standalone:是否独立 (yes/no)
  2. 指令: 结合css

    < ?xml- stylesheet type= "text/css" href="a.css" ?>
    
  3. 标签:标签名称时自定义的

    • 规则:
      • 名称可以含字母、数字以及其他的字符
      • 名称不能以数字或者标点符号开始
      • 名称不能以字符 “xml”(或者 XML、Xml)开始
      • 名称不能包含空格
  4. 属性

    • id属性值唯一
  5. 文本

    • CDATA区:在该区域中的数据会被原样展示
      • 格式:<![CDATA[ 数据 ]]>

约束

规定XML文档的书写规则

分类:

  1. DTD:一种简单的约束技术, 用于定义 XML 文档中的合法元素的标准。
  2. Schema:一种复杂的约束技术

DTD

  • 引入dtd文档到xml文档中
    • 内部dtd : 将约束规则定义在xml文档中
    • 外部dtd : 将约束的规则定义在外部的dtd文件中
      • 本地 : <!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
      • 网络 : <!DOCTYPE 根标签名 PUBLIC "dtd文件名字” "dtd文件的位置URL">

一个简单的DTD文件示例:

<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

CDATA

CDATA 的意思是字符数据(character data)。

声明一个元素

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:

<!ELEMENT 元素名称 类别>

或者

<!ELEMENT 元素名称 (元素内容)>

空元素

<!ELEMENT 元素名称 EMPTY>

Schema

XSD

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

<xs:element name="note">
    <xs:complexType>
      <xs:sequence>
	<xs:element name="to" type="xs:string"/>
	<xs:element name="from" type="xs:string"/>
	<xs:element name="heading" type="xs:string"/>
	<xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>

引人∶

  1. 填写xml文档的根元素

  2. 引人xsi前缀. xmlns:xsi="http://www.w3.org/2001/xMLSchema-instance"

  3. 引入xsd文件命名空间. xsi:schemaLocation="http: //www.itcast.cn/xml student.xsd"

  4. 4.为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml"

解析

操作xml文档

  1. 解析(读取) : 将文档中的数据读取到内存中
  2. 写入∶将内存中的数据保存到xml文档中。持久化的存储

解析XML的的方式:

  1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树 (主要用于服务端)
    • 优点 : 操作方便,可以对文档进行增删改查的所有操作
    • 缺点 : 消耗内存大
  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

基本步骤:
  1. 导入jar包
  2. 获取Document对象
  3. 获取对应的标签Element对象
  4. 获取数据
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

public class JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        // 获取Document对象,根据xml文档
            // 获取路径
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
            // 解析xml文档,加载文档进内存,获取dom树
        Document document = Jsoup.parse(new File(path), "UTF-8");
        // 获取元素对象Element
        Elements elements = document.getElementsByTag("name");  // Elements继承的ArrayList
        System.out.println(elements.size());

        // 取第一个name元素对象
        Element name1 = elements.get(0);
        // 获取第一个name元素的数据
        System.out.println(name1.text());
        
    }
}
常见的对象使用
  • Jsoup:工具类,可以解析HTML或XML文档,返回Document

    • parse系列:解析HTML或XML文档,返回Document

      • static Document parse(File in, String charsetName) :解析xml或html文件的。

        // 获取路径
        String path = JsoupDemo2.class.getClassLoader().getResource("student.xml").getPath();
        // 解析xml文档,加载文档进内存,获取dom树
        Document document = Jsoup.parse(new File(path), "UTF-8");
        System.out.println(document);
        
      • static Document parse(String html) :解析xml和html字符串

      • static Document parse(URL url, int timeoutMillis) : 通过网络路径获取指定的html或XML的文档对象

  • Document:文档对象,代表内存中dom树

    • 获取Element对象
    • Element getElementById(String id):根据id属性值获取唯一的Element对象
    • Elements getElementsByTag(String tagName):根据标签名称获取元素对象集合
    • Elements getElementsByAttribute(String key):根据属性名称获取元素对象集合
    • Elements getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值来获取元素对象集合
  • Elements:元素Element对象的集合,看作ArrayList<Element>使用

  • Element:元素对象

    • 获取属性值:String attr(String key):根据属性名称获取属性值
    • 获取文本内容:
      • String text():获取文本内容
      • String html():获取标签内部的所有内容(包括子标签)
  • Node:节点对象

    • 是Document和Element的父类
快捷查询的方式
  1. selector:选择器
    • 使用的方法:Elements select(String cssQuery)
    • 语法类似于JQuery的 (可以查看Selector类定义语法)
    // 获取Document对象
    String path = JsoupDemo2.class.getClassLoader().getResource("student.xml").getPath();
    Document document = Jsoup.parse(new File(path), "UTF-8");
    
    Elements students_student_name = document.select("students student[number=\"sid_01\"] name");
    System.out.println(students_student_name);
    
  2. JsoupXPath:

    XPath即为XML路径语言(XML Path Language),它是一种用来确定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);

//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属性值为zr

List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='zr']");
for (JXNode jxNode : jxNodes4) {
    System.out.println(jxNode);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值