XML文档详解

目录

XML文档

一、XML文件

二、Dom4J解析XML文件

三、Sax解析XML文件

四、使用Dom4j的XPath解析XML文件

4.1XPath语法

4.2 获取sys-config.xml文件的配置信息

4.3 获取server.xml文件的配置信息

4.4 获取bookstore.xml文件的配置信息


XML文档

一、XML文件

1.1 学习重点

由于在现代开发过程中,不需要开发人员手动解析XML文档,因此本次课程主要内容了解XML文档基本学习,以及XML约束文档内容。

1.2 XML编程语言

  • 名称:可扩展标记编程语言,就是开发者在符合XML命名规则的基础之上,可以根据自己的需求定义自己的标签。

  • XML文档作用:

    • 主要用来存储数据

    • 最初XML文档作为网页来使用(现在是HTML)

    • 在Java使用XML文档来代替properties作为配置文件

  • 解析XML文件的方法:DOM、DOM4J、SAX

1.3 XML语法

  • HTML是从XML演化出来的一种编程语言,XML与HTML是父子关系。

  • HTML绝大多数语法都来自XML。

  • 一个XML文档必须以一个根目录标签开始,其它标签必须作为根目录标签的直接子标签或者间接子标签出现。

  • HTML标签对于英文字母大小是忽略不计,但是XML标签必须区分英文字母大小写。

  • HTML标签中属性内容可以通过一对" "包含,也可以不用。XML标签属性内容必须包含在一对" "或者' '。

1.4 XML文档读取方式

  • SAX读取方式:根据开发人员需要,一次将若干个满足条件标签加载到内存中。

    • 优点:可以节省内存。

    • 缺点:如果读取大量标签信息时,运行效率相对较低。

  • DOM读取方式:一次性将XML文档所有的内容加载到内存中。

    • 优点:如果读取大量标签信息时,此时由于是在内存中进行定位,所有运行速度较快。

    • 缺点:浪费内存。

  • 实际开发过程中,一般都采用DOM方式来读取。

二、Dom4J解析XML文件

2.1导入Dom4J.jar包

2.2 Dom4J常用的对象

  • SAXReader:读取XML文件到Document树结构文件对象。

  • Document:是一个XML文档对象树,类比HTML文档对象。

  • Element:元素节点。通过Document对象可以查找单个元素。

2.3 Dom4J解析步骤

package com.hhb.xml;
​
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
​
import java.util.Iterator;
​
public class Dom4jTest {
    public static void main(String[] args) throws Exception {
​
        //创建解析器
        SAXReader reader = new SAXReader();
        //通过解析器的read方法将配置文件读取到内存当中,生成一个Document对象树
        Document document = null;
        document = reader.read("C:\\Users\\Administrator\\IdeaProjects\\xml1\\conf\\students.xml");
        //获取根节点
        Element root = document.getRootElement();
        //开始遍历根节点
        //遍历 root 根节点下的 student 子节点
        for (Iterator iter = root.elementIterator(); iter.hasNext(); ) {
            //获取 student 节点对象
            Element stuElement = (Element) iter.next();
            //遍历 stuElement 节点下的所有子节点:name,colleage,telephone,note
            for (Iterator innerIter = stuElement.elementIterator(); innerIter.hasNext(); ) {
                //获取 student 节点下的子节点对象
                Element innerElement = (Element) innerIter.next();
                //通过 innerElement 的 getName()获取节点名称,getStringValue()获取节点值
                String innerValue = innerElement.getStringValue();
                System.out.println(innerValue);
            }
            System.out.println("--------------------------------");
        }
    }
}
 

三、Sax解析XML文件

3.1 SAX方式:事件驱动,边读边写

  • 优点:无需将整个文档加载到内存中,所有内存消耗较少,适合解析特别大的XML文件。

SAX解析步骤

package com.hhb.xml;
​
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
​
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
​
public class SAXTest {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //创建解析工厂:通过newInstance()方法获取
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        //创建解析器
        SAXParser saxParser = saxParserFactory.newSAXParser();
        //执行parser方法,传入两个参数:XML文件路径、事件处理器
        saxParser.parse("C:\\Users\\Administrator\\IdeaProjects\\xml1\\conf\\persons.xml", new MyDefaultHander1());
    }
}
//创建一个类,继承DefaultHandler类,重写三个方法
//startElement 获取开始标签,重要的两个参数说明
//qName 把标签名称返回
//attributes 返回标签中的属性对象
//character 获取标签文本内容
//endElement 获取结束标签
class MyDefaultHander1 extends DefaultHandler {
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.print("<" + qName + ">");
    }
​
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        System.out.print(new String(ch, start, length));
    }
​
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.print("</" + qName + ">");
    }
}

 

 

四、使用Dom4j的XPath解析XML文件

4.1XPath语法

  • XPath使用路径表达式来选取XML文档中的节点或节点集。节点是通过沿着路径(path)或者(steps)来的。

  • XML实例文档

    <?xml version="1.0" encoding="ISO-8859-1"?>
    ​
    <bookstore>
    ​
    <book>
      <title lang="eng">Harry Potter</title>
      <price>29.99</price>
    </book>
    ​
    <book>
      <title lang="eng">Learning XML</title>
      <price>39.95</price>
    </book>
    ​
    </bookstore>
  • 路径表达式

    表达式描述
    nodename选取此节点的所有子节点
    /从根节点选取
    //从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
    .选取当前节点
    ..选取当前节点的父节点
    @选取属性
  • 实例

    路径表达式结果
    bookstore选取bookstore元素的所有子节点
    /bookstore选取根元素bookstore(假如路径起始于正斜杠/,则此路径始终代表到某元素的绝对路径)
    bookstore/book选取属于bookstore的子元素的所有book元素
    //book选取所有book子元素,而不管它们在文档中的位置
    bookstore//book选取属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置
    //@lang选取名为lang的所有属性
    路径表达式结果
    /bookstore/book[1]选取属于bookstore子元素的第一个book元素
    /bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
    /bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
    /bookstore/book[position()<3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
    //title[@lang]选取所有拥有名为lang的属性的title元素
    //title[@lang='eng']选取所有title元素,且这些元素拥有值为eng的lang属性
    /bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
    /bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

4.2 获取sys-config.xml文件的配置信息

准备工作

  • 导入dom4j-1.6.1.jar 和 jaxen-1.1-beta-7.jar

  • sys-config.xml文档

    <?xml version="1.0" encoding="UTF-8"?>
    <config>
        <database-info>
            <driver-name>com.mysql.jdbc.Driver</driver-name>
            <url>jdbc:mysql://192.168.1.151:3366/bjpowernode</url>
            <user>root</user>
            <password>123</password>
        </database-info>
    </config>

解析步骤

package com.hhb.xml;
​
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
​
public class SysConfigTest {
    public static void main(String[] args) throws Exception{
        //创建解析器
        SAXReader reader = new SAXReader();
        //通过解析器的read方法将配置文件读取到内存中,生成一个Document对象树
        Document document = reader.read("C:\\Users\\Administrator\\IdeaProjects\\xml1\\conf\\sys-config.xml");
        //获取driver-name节点元素对象的文本内容
        Element driverNameElt = (Element) document.selectSingleNode("/config/database-info/driver-name");
        String driverName = driverNameElt.getStringValue();
        System.out.println(driverName);
        //获取url节点元素对象的文本内容
        Element urlElt = (Element) document.selectSingleNode("config//url");
        String url = urlElt.getStringValue();
        System.out.println(url);
        //获取user节点
        Element userElt = (Element) document.selectSingleNode("//user");
        String user = userElt.getText();
        System.out.println(user);
        //获取password节点
        Element passwordElt = (Element) document.selectSingleNode("//password");
        String password = passwordElt.getTextTrim();
        System.out.println(password);
    }
}

4.3 获取server.xml文件的配置信息

package com.hhb.xml;
​
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
​
public class ServerTest {
    public static void main(String[] args) throws Exception{
        //创建解析器
        SAXReader reader = new SAXReader();
        //通过解析器的read方法将配置文件读到内存中,生成一个Document对象树
        Document document = reader.read("C:\\Users\\Administrator\\IdeaProjects\\xml1\\conf\\server.xml");
        //获取connector节点元素对象的路径
        Element connectorElt = (Element) document.selectSingleNode("//connector");
        //获取connectorElt节点元素对象的port属性对象
       // Attribute portAttr = connectorElt.attribute("port");
        //获取portAttr属性对象的值
        //String port = portAttr.getStringValue();
        String port = connectorElt.attributeValue("port");
        System.out.println(port);
    }
}
​

4.4 获取bookstore.xml文件的配置信息

package com.hhb.xml;
​
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
​
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
​
public class BookTest {
    public static void main(String[] args) throws Exception {
        //创建解析工厂
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        //创建解析器
        DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
        //创建解析器读取配置文件,生成一个Document对象树
        Document document = builder.parse("C:\\Users\\Administrator\\IdeaProjects\\xml1\\conf\\bookstore.xml");
        //创建XPath对象
        XPath xPath = XPathFactory.newInstance().newXPath();
​
        //获取bookstore节点下book属性category值为web的title属性为en的节点内容
        //bookstore -> book[@category='web'] -> title[@lang='en']
        String titleLangXpath = "/bookstore/book[@category='web']/title[@lang='en']";
        String titleLangValue = (String) xPath.evaluate(titleLangXpath, document, XPathConstants.STRING);
        System.out.println(titleLangValue);
​
        //获取bookstore节点下book属性category值为web下的第二个title节点的文本内容
        String titleXpath="/bookstore/book[@category='web'][2]/title/text()";
        String titleValue = (String) xPath.evaluate(titleXpath, document, XPathConstants.STRING);
        System.out.println(titleValue);
​
        //获取bookstore下book属性category值为cooking的title的lang属性的值
        String titleLangAttrXpath="/bookstore/book[@category='cooking']/title/@lang";
        String titleLangAttrValue = (String) xPath.evaluate(titleLangAttrXpath, document, XPathConstants.STRING);
        System.out.println(titleLangAttrValue);
​
        //获取bookstore节点下所有book的节点集合
        NodeList bookList = (NodeList) xPath.evaluate("/bookstore/book", document, XPathConstants.NODESET);
        //开始遍历bookList
        for (int i=0;i<bookList.getLength();i++){
            Element bookElt = (Element) bookList.item(i);
            String titleValue01 = (String) xPath.evaluate("title", bookElt, XPathConstants.STRING);
            String authorValue = (String) xPath.evaluate("author", bookElt, XPathConstants.STRING);
            String year = (String) xPath.evaluate("year", bookElt, XPathConstants.STRING);
            String price = (String) xPath.evaluate("price", bookElt, XPathConstants.STRING);
            System.out.println(titleValue01+" "+authorValue+" "+year+" "+price);
            System.out.println("-------------------------------------------");
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mybatis是一种Java持久化框架,它可以将Java对象映射到数据库中的表中。Mybatis的配置文件主要包括两个部分:mybatis-config.xml和mapper.xml。其中mapper.xml是Mybatis的核心配置文件,它定义了SQL语句、映射关系、参数映射等信息,下面详细介绍mapper.xml文件的各个部分。 1、mapper.xml的命名空间 每个mapper.xml文件都应该设置一个命名空间,命名空间用来定义映射的SQL语句和参数映射。命名空间的格式为:mapper namespace="com.xxx.mapper.XxxMapper",其中com.xxx.mapper是mapper接口所在的包名,XxxMapper是mapper接口的类名。 2、映射SQL语句 在mapper.xml中,可以定义各种SQL语句,例如查询、插入、更新和删除等。SQL语句的格式为<select|insert|update|delete>,其中<select>表示查询语句,<insert>表示插入语句,<update>表示更新语句,<delete>表示删除语句。具体的SQL语句可以根据需要自行定义,例如: <select id="selectUserById" parameterType="int" resultType="com.xxx.model.User"> select * from user where id=#{id} </select> 在上面的例子中,id表示SQL语句的唯一标识符,parameterType表示传入参数的类型,resultType表示返回结果的类型。 3、参数映射 在mapper.xml中,可以定义参数映射,将Java对象映射到SQL语句中的参数,例如: <select id="selectUserByName" parameterType="java.lang.String" resultType="com.xxx.model.User"> select * from user where name=#{name} </select> 在上面的例子中,parameterType表示传入参数的类型,#{name}表示将Java对象中的name属性映射到SQL语句中的参数。 4、结果集映射 在mapper.xml中,可以定义结果集映射,将SQL语句返回的结果封装成Java对象,例如: <select id="selectAllUser" resultType="com.xxx.model.User"> select * from user </select> 在上面的例子中,resultType表示返回结果的类型,Mybatis会将SQL语句返回的结果封装成com.xxx.model.User对象。 5、动态SQL语句 在mapper.xml中,可以使用动态SQL语句来构建复杂的SQL语句。动态SQL语句可以根据不同的条件来生成不同的SQL语句,例如: <select id="selectUser" parameterType="com.xxx.model.User" resultType="com.xxx.model.User"> select * from user where 1=1 <if test="id != null"> and id=#{id} </if> <if test="name != null and name != ''"> and name=#{name} </if> </select> 在上面的例子中,<if>标签用来判断条件,根据条件生成不同的SQL语句。 6、其它元素 在mapper.xml中,还可以使用其它元素来完成更多的功能,例如: (1)<resultMap>元素:定义结果集映射关系; (2)<include>元素:引入其它的SQL语句; (3)<where>、<set>等元素:用于构建复杂的SQL语句; (4)<foreach>元素:用于遍历集合或数组等。 总之,mapper.xml文件是Mybatis框架中非常重要的配置文件,它定义了SQL语句、映射关系、参数映射等信息,是Mybatis实现持久化操作的核心。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ja kar ta

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值