Java基础---解析读xml文档内容来CRUD

一、为啥有xml文档

因为properties文件 
		只能表示 键值对,
		不能表示 层级关系【日本--->京都】

二、xml文档 是怎样的

可扩展标记语言。
在此中,可 自定义标签【开始+结束】
标签包含关系=数据间关系

用以  配置参数
【如 
c3p0-config.xml
DataSource ds=new ComboPoolelDataSource();
后者肯定通过某种方式  读取了前者中配置参数
拿到ds
】

三、组成部分【了解】
1)XML文档的声明:

<?xml version=”1.0” encoding=”utf-8” standalone=”yes” ?>
version=”1.0”:xml的版本(遵循的标准)
encoding=”utf-8”:编码
standalone=”yes”:是否是独立的xml文档,不需要其他外部的引用。
【默认是standalone="no"  
可以有其他文档关联运行  
如引入css文件】

2)元素:

自定义标签  = 元素,
标签 ———— 开始标签 、结束标签

3)属性:

在标签中的属性,比如:<成都 name=”cd”>

注意:元素和属性需要遵循以下命名规则:

区分大小写
不能以数字或者下划线开头
不能包含空格
不能以xml或者XML命名
名字中间不能使用冒号

4)注释:

<!-- 注释内容 -- >

5)数据区:
CDATA区

<![CDATA[
数据区的内容,在这里面,会把标签解析为普通的数据内容。
]]>

6)需转义的字符

& 转义为 :&amp;    
< 转义为 :&lt;
> 转义为 :&gt;       
 “  转义为 :&quot;
‘  转义为 :&apos;

7)执行命令 引入css文件

<?xml-stylesheet type=”text/css” href=”css文件” ?>

四、我们来创建1个xml文件:【卵用】
在这里插入图片描述
因为仅能有 1个根节点,
所以加 对address 包起。

同学写的:

<a> </a>  =   <a />

在这里插入图片描述
五、用Java代码 解析读取 xml文件中 内容 来 CRUD【重点】

1.我的xml结构:
在这里插入图片描述
属性 解析为 attribute
标签 解析为 element
标签中的内容 解析为 content
【扩展:dom4j 是xml文档的 开发包】

2.解析方式

2种 ———— dom、sax

dom
	一次性 解析所有document 到 内存,
	要哪个document对象  就从内存中  拿。
	【占内存、利于CRUD=增删改查=效率高】

sax
	要哪个document对象  就解析读取1次document
	【不咋占内存、效率低=淘汰】

3.开始写吧
3.1 创建我的xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?><user>

    <u1>
        <username>张三</username>
        <password>zhangsan</password>
        <money>100.0</money>
    </u1>
    <u2>
        <username>李四</username>
        <password>lisi</password>
        <money>50000.0</money>
    </u2>

</user>

3.2 创建读xml的class

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;

public class Readxml {
    public static void main(String[] args) throws Exception {

        //查
//        myQuery();

        //改
//        myChange();

        //增
//        myAdd();

        //改
        mydel();
    }




    /**
     * 查询  (xml文件中标签中  内容)
     *     1. 解析出xml文件的 dom对象
     *     2.通过dom对象 拿到指定节点
     *     3.通过节点 拿到此中内容
     */
    public static void myQuery() throws ParserConfigurationException, IOException, SAXException {

        //DocumentBuilderFactory
        // 定义工厂API,使应用程序能够从XML文档获取生成DOM对象树的解析器
        //newInstance() 
        //获得一个新的一个 DocumentBuilderFactory实例。 
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        //newDocumentBuilder()
        //使用当前配置的参数创建一个新的DocumentBuilder实例。
        //DocumentBuilder
        //定义从XML文档获取DOM文档实例的API。 使用这个类,应用程序员可以从XML获得一个Document 。
        //这个类的一个实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获得。
        // 一旦获得此类的实例,可以从各种输入源解析XML。
        DocumentBuilder db = dbf.newDocumentBuilder();

        //parse(File f) 
        //将给定文件的内容解析为XML文档,并返回一个新的DOM Document对象。 
        Document document = db.parse(new File("src\\main\\resources\\user.xml"));

        //getElementsByTagName(String tagname)
        //      以文件顺序返回 NodeList所有 Elements的给定标签名称,并包含在文档中。
        //NodeList
        //     只能装node  则不需要泛型
        //    不是Collection下面的实现类
        NodeList usernameList = document.getElementsByTagName("username");

        //item(int index) 
        //返回 index中的index项=node
        Node node = usernameList.item(0);

        //getTextContent() 
        //返回此 节点  及其后代的  文本内容=String
        String username = node.getTextContent();

        System.out.println(username);//张三
    }


    /**
     * 改
     *      1.拿到dom对象
     *      2.拿到节点
     *      3.set更新此中内容[仅内存]
     *
     *      4.传给文件
     */
    public static void myChange() throws ParserConfigurationException, IOException, SAXException, TransformerException {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document adocument = db.parse(new File("src\\main\\resources\\user.xml"));

        Node money = adocument.getElementsByTagName("money").item(1);
        money.setTextContent("50000.0");

        //Transformer可由TransformerFactory.newTransformer方法获得
        Transformer transformer = TransformerFactory.newInstance().newTransformer();

        //transform(Source xmlSource, Result outputTarget)
        //将XML Source转换为 Result=写出到指定xml文件
        //      前者Source xmlSource 要写出的 在此方法中已修改的 document源————new DOMSource(document对象)
        //      后者Result outputTarget 以此覆盖或新建整个xml文件————new StreamResult(new File(路径文件名
        transformer.transform(new DOMSource(adocument),new StreamResult(new File("src\\main\\resources\\user.xml")));

    }


    /**
     * 增(1对标签)
     *      1.拿到dom对象
     *      3.create1个标签  并加入内容
     *      4.获取父节点 或 兄弟节点
     *      5.append  或 before 到以上节点
     *
     *      6.传给文件
     *
     */
    public static void myAdd() throws Exception{
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse(new File("src\\main\\resources\\user.xml"));

        Element food = document.createElement("food");
        food.setTextContent("章鱼丸子");

        //向 父标签 append
//        document.getElementsByTagName("u1").item(0).appendChild(food);

        //向 父标签内 兄弟标签 before
        //既然如此 新加标签food放前者
        document.getElementsByTagName("u1").item(0).insertBefore(food,document.getElementsByTagName("username").item(0));

        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(document),new StreamResult(new File("src\\main\\resources\\user.xml")));
    }


    /**
     * 删除
     *      1.拿到dom
     *      2.拿到 要删除的节点
     *      3.java中无自杀————通过此节点 拿到父节点removeChild
     */
    public static void mydel() throws Exception{
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse(new File("src\\main\\resources\\user.xml"));

        Node food = document.getElementsByTagName("food").item(0);
        food.getParentNode().removeChild(food);

        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(document),new StreamResult(new File("src\\main\\resources\\user.xml")));

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值