Java高级特性:XML文件的读写

目录

一、XML简介

1、XML声明

2、XML元素

3、XML根元素

4、MXL属性

5、XML中特殊字符处理

6、XML格式:

二、XML的解析

1、DOM介绍

2、org.w3c.dom包中的常用接口

3、DOM读取XML的步骤

4、读取DOM树

5、保存XML文件

6、DOM树添加信息

7、DOM树修改信息

8、DOM树删除信息

DOM4J

1、DOM4j的常用接口

2、DOM4J的安装

3、DOM4J对XMl文件的操作



一、XML简介

XML(EXtensible Markup Language):可扩展标记语言,是一种很像HTML的标记语言。XML 的设计宗旨是传输数据,而不是显示数据。XML 标签没有被预定义。您需要自行定义标签。XML 是 W3C 的推荐标准。XML与操作系统、编程语言的开发平台无关、规范统一。

XML HTML 之间的差异

XML HTML 为不同的目的而设计:

XML 被设计用来传输和存储数据,其焦点是数据的内容。

HTML 被设计用来显示数据,其焦点是数据的外观。

1、XML声明

XML声明:用以表明该文件是一个XML文档

语法:

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

XML声明的组成部分:

version:文档符合XML1.0规范

encoding:文档字符编号,默认为”UTF-8”

对于任何一个XML文档,其声明部分都是固定的格式

XML标签:用<>括起来的各种标签来标记数据,并且要成对出现

语法:

<标签名>标签描述的内容</标签名>
<author>明日科技</author>

标签名是自己命名的,要见名知意任何一个XML文件可以包含任意数量的标签

2、XML元素

元素由开始标签、元素内容和标签组成。元素内容可以包含子元素、字符数据等。

语法:

<元素名 属性名=“属性值”>元素内容</元素名>

实例:

<book id="101">
        <author>明日科技</author>
        <title>Java从入门到精通</title>
        <description>零基础入门,适合自学</description>
</book>

3、XML根元素

每个XML文档有且只有一个根元素

根元素特点:

1、根元素是一个完全包括文档中其他所有元素的元素。

2、根元素的开始标签要放在所有其他元素的开始标签之前。

3、根元素的结束标签要放在所有其他元素的结束标签之后。

4、MXL属性

1、一个元素可以有多个属性,多个属性之间用空格隔开

2、属性只能放在开始标签中。

3、属性值用双引号包括,属性值中不能直接包含<,>,",&

语法:

<元素名 属性名=“属性值” 属性名=“属性值” >元素内容</元素名>

实例:

<book id="101">
        <author>明日科技</author>
        <title>Java从入门到精通</title>
        <description>零基础入门,适合自学</description>
</book>

5、XML中特殊字符处理

XML文档中,有时在元素的文本中会出现一些特殊的字符(如<>&),为了正确的解析这些特殊字符内容,可以使用转义符CDATA

符号转义符
<&lt
>&gt
"&quot
'&apos
&&amp

当元素中出现很多特殊字符时,可以使用CDATA,如:

<description>
         <![CDATA[讲解了元素<title>以及</title>的使用]]>
</description>

6、XML格式:

1、必须有XML声明语句。

2、必须有且只有一个根元素。

3、XML标签对大小写敏感。

4、XML标签成对出现。

5、XML元素正确的嵌套。

6、元素名称可以包含字母、数字或其他的字符。

7、元素名称不能以数字或者标点符号开始。

8、元素名称中不能含空格。

XML的命名空间:

XML解析器在解析XML文档时,对于重名的元素,可能出现解析冲突。

命名空间的作用:命名空间有助于标准化元素和属性,并为它们加上唯一的标识,提供避免元素命名冲突的方法。

语法:

xmlns:[prefix]=“[命名空间的URI]”

实例:

<?xml version="1.0" encoding="UTF-8"?>
<cameras xmlns:canon="http://www.canon"
    xmlns:nikon="http://www.nikon.com">
    <canon:camera prodID="P663" name="Camera傻瓜相机"/>
    <nikon:camera prodID=“K29B3” name=“Camera超级35毫米相机"/>
</cameras>

XML实例:

<?xml version="1.0" encoding="UTF-8"?><books>
    <book id="101">
        <author>李刚</author>
        <title>Java从入门到精通</title>
        <description>零基础入门,适合自学</description>
    </book>
    <book id="102">
        <author>关东升</author>
        <title>Java从小白到大牛</title>
        <description>Oracle公司官方推荐用书</description>
    </book>

二、XML的解析

四种常见的XML解析技术

DOM解析:基于XML树结构、比较耗资源、适用于多次访问XML

SAX解析:基于事件、消耗资源小、适用于数据量较大的XML

JDOM解析:比DOM更快、JDOM仅使用具体类而不使用接口

DOM4J解析:非常优秀的Java XML API、性能优异、功能强大、开放源代码

本文主要写DOM解析和DOM4J解析:

1、DOM介绍

DOMDocument Object Model即文档对象模型的简称。DOM把XML文档映射成一个倒挂的树。

DOM可以把XML模型表示出来,例如:

 DOM解析XML:

 甲骨文公司提供了JAXPJava API for XML Processing)来解析XML

JAXP会把XML文档转换成一个DOM树。

JAXP包含3个包,这3个包都在JDK中:

org.w3c.dom:W3C推荐的用于使用DOM解析XML文档的接口。

org.xml.sax:用于使用SAX解析XML文档的接口。

javax.xml.parsers:解析器工厂工具,程序员获得并配置特殊的解析器。

2、org.w3c.dom包中的常用接口

Document接口:Document对象代表整个XML文档,它也是对XML文档进行操作的起点。Document接口继承自Node接口

常用方法方法说明

Element createElement(String tagName)

创建指定标记名称的元素。

Element getDocumentElement()

获取代表XML文档根元素的对象。

NodeList getElementsByTagName(String tagName)

按文档顺序返回文档中指定标记名称的所有元素集合

Node接口:表示树中的一个抽象节点。

常用方法方法说明

Node appendChild(Node newChild)

将节点 newChild 添加到此节点的子节点列表的末尾。

NodeList getChildNodes()

获取该元素的所有子节点,返回节点的列表。

Node getFirstChild()

此节点的第一个子节点。

Node getLastChild()

此节点的最后一个节点。

Node getParentNode()

此节点的父节点。

String getNodeName()

获取节点的名称。

String getTextContent()

此属性返回此节点及其后代的文本内容。

Node removeChild(Node newChild)

从子节点列表中移除 oldChild 所指示的子节点,并将其返回。

 NodeList接口:包含了一个或者多个节点的列表。

常用方法方法说明

int getLength (String tagName)

返回列表的长度。

Node item(int index)

返回集合中的第 index 个项。如果 index 大于或等于此列表中的节点数,则返回 null

Element接口:代表XML文档中的标签元素。

Element接口继承自Node,也是Node最主要的子对象。在标签中可以包含属性。

常用方法方法说明

String getAttribute(String name)

通过名称获得属性值。

Attr getAttributeNode(String name)

通过名称获得属性节点。

NodeList getElementsByTagName(String tagName)

以文档顺序返回具有给定标记名称的所有后代 Elements NodeList

void setAttribute(String name, String value)

添加一个新属性

3、DOM读取XML的步骤

1.创建解析器工厂对象(DocumentBuilderFactory)。

2.由解析器工厂对象创建解析器对象(DocumentBuilder)。

3.由解析器对象对指定XML文件进行解析,构建相应DOM,创建Document对象。

4.Document对象为起点对DOM树的节点进行增删改查操作使用

4、读取DOM树

public void show(){
Document document = null;
        //创建解析器工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            //从解析器工程获取解析器实例
            DocumentBuilder builder = factory.newDocumentBuilder();
            //解析XML文件,创建Document对象,得到DOM树
            document = builder.parse("E:\\javapj\\advanced\\books.xml");
            //得到所有Book节点信息
            NodeList bookList = document.getElementsByTagName("book");
            //遍历所有book节点
            for (int i = 0; i < bookList.getLength(); i++) {
                //获取第i个book元素信息
                Node bookNode = bookList.item(i);
                //获取第i个book节点的id属性
                Element bookEle = (Element) bookNode;
                String bookStr = bookEle.getAttribute("id");
                //打印输出
                System.out.println("id:" + bookStr);
                //获取所有book的子标签
                NodeList childList = bookNode.getChildNodes();
                String nodeName = "";
                //对所有节点的子节点循环遍历
                for (int j = 0; j < childList.getLength(); j++) {
                    //获取第j个子节点元素信息
                    Node childNode = childList.item(j);
                    //如果当前Node是Element,则进行转换
                    if (childNode.getNodeType() == Node.ELEMENT_NODE){
                        Element childEle = (Element)childNode;
                        //获取子节点的属性
                        String childName = childEle.getAttribute("name");
                        //获取子节点的内容
                        nodeName = childNode.getTextContent();
                        System.out.println( childName + "\t" + nodeName);
                    }
                }
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
    }

5、保存XML文件

public void saveXML(String path){
        //创建一个转换工厂
        TransformerFactory factory = TransformerFactory.newInstance();
        try {
            //使用转换工程创建一个转换器
            Transformer former = factory.newTransformer();
            //进行转换,DOM树-----》XML文件
            Source xmlSource = new DOMSource(document);
            //path为文件地址
            Result outPutTarget = new StreamResult(path);
            former.transform(xmlSource,outPutTarget);
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }

6、DOM树添加信息

public void addBook(){
        //创建一个book节点
        Element newBook = document.createElement("book");
        //添加节点属性
        newBook.setAttribute("id","004");
        //创建子节点
        Element newauthor = document.createElement("author");
        //对子节点添加属性
        newauthor.setAttribute("name","刘慈欣");
        //添加内容
        newauthor.setTextContent("女");
        //创建子节点
        Element newtitle = document.createElement("title");
        newtitle.setTextContent("三体");
        //将子节点连接到节点处
        newBook.appendChild(newauthor);
        newBook.appendChild(newtitle);
        //将newBook挂到DOM树上
        document.getElementsByTagName("book").item(0).appendChild(newBook);
}

7、DOM树修改信息

public void revise(){
        //找到book节点
        NodeList bookList = document.getElementsByTagName("book");
        //对book节点循环遍历
        for (int i = 0; i < bookList.getLength(); i++) {
            Node bookNode = bookList.item(i);
            Element bookElement = (Element) bookNode;
            if (bookElement.getAttribute("id").equals("101")){
                //修改节点的name属性值
                bookElement.setAttribute("id","111");
            }
            //获取所有book的子标签
            NodeList childList = bookNode.getChildNodes();
            //获取子节点的id
            int id = Integer.parseInt(bookElement.getAttribute("id"));
            if (id == 111){
                //对子节点循环遍历
                for (int j = 0; j < childList.getLength(); j++) {
                    Node childNode = childList.item(j);
                    //对子节点的内容进行修改
                    if ("author".equals(childNode.getNodeName())){
                        childNode.setTextContent("女");
                    }
                }
            }
        }
    }

8、DOM树删除信息

public void delete() {
        //找到book节点
        NodeList bookList = document.getElementsByTagName("book");
        //对book节点循环遍历
        for (int i = 0; i < bookList.getLength(); i++) {
            Node bookNode = bookList.item(i);
            Element bookElement = (Element) bookNode;
            //获取子节点的id
            int id = Integer.parseInt(bookElement.getAttribute("id"));
            if (id==102){
                //删除id为102的节点
                document.getDocumentElement().removeChild(bookElement);
            }
        }
    }

DOM4J

DOM4Jdom4j.org 出品的一个开源 XML 解析包。

Dom4J是一个易用的、开源的库,用于XMLXPathXSLT。它应用于Java平台,采用了Java集合框架并完全支持DOMSAXJAXP

1、DOM4j的常用接口

DOM4J的常用接口都在org.dom4j包里定义。

接口说明

Attribute

定义了 XML 的属性。

Document

定义了XML 文档。

Element

定义了XML 元素

Node

DOM4J中所有的XML节点定义了多态行为

2、DOM4J的安装

首先下载Dom4J

1、点击file选择ProjectStructure

 2、点击Libraries

 3、先点击+,然后选择java

 4、找到下好的DOM4J文件目录点击ok

 5、点击ok

3、DOM4J对XMl文件的操作

加载DOM树信息

public class Dom4j {
    Document document = null;
    //加载DOM树信息
    public void LoadDom(){
        SAXReader saxReader = new SAXReader();
        try {
            document = saxReader.read("E:\\javapj\\advanced\\books.xml");
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

显示XML信息

public void show(){
        //获取DOM树根节点
        Element root = document.getRootElement();
        Iterator itBook = root.elementIterator();
        //遍历迭代器,itBook.hasNext()判断是否有下一个元素
        while (itBook.hasNext()){
            //获取根节点
            Element bookEle = (Element) itBook.next();
            //获取根节点属性
            String bookStr = bookEle.attributeValue("id");
            //使用迭代器获取子节点
            Iterator childIt = bookEle.elementIterator();
            System.out.println(bookStr);
            //遍历迭代器,childIt.hasNext()判断是否有下一个元素
            while (childIt.hasNext()){
                //获取子节点
                Element authorEle = (Element) childIt.next();
                //获取子节点属性
                String authorStr = authorEle.attributeValue("name");
                //获取子节点内容
                String author = authorEle.getText();
                System.out.println(authorStr + "\t" + author);
            }
        }
    }

保存XML文件

public void saveXML(String path){
        //创建格式化器
        OutputFormat format = OutputFormat.createPrettyPrint();
        //指定编码格式
        format.setEncoding("utf-8");
        try {
            //指定XML文件的保存路径,new FileWrite字符流 path为路径
            XMLWriter writer = new XMLWriter(new FileWriter(path),format);
            writer.write(document);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

DOM树添加节点

public void addbook(){
        //获取根节点
        Element root = document.getRootElement();
        //创建一个book节点
        Element bookEle = root.addElement("book");
        //给book节点设置属性
        bookEle.addAttribute("id","006");
        //创建子节点
        Element authorEle = bookEle.addElement("author");
        //给子节点节点设置属性
        authorEle.addAttribute("name","李白");
        //给子节点添加内容
        authorEle.addText("蜀道难");
        this.saveXML("新的数据.xml");

    }

DOM树修改节点

public void revise(){
        //获取根节点
        Element root = document.getRootElement();
        int id = 0;
        使用迭代器获根节点
        Iterator itbook = root.elementIterator();
        //遍历根节点
        while (itbook.hasNext()){
            id++;
            Element bookEle = (Element) itbook.next();
            //对根节点属性进行修改
            bookEle.addAttribute("id",id + "");
        }
    }

DOM树删除节点

public void delete(){
        //获取根节点
        Element root = document.getRootElement();
        //使用迭代器获根节点
        Iterator itbook = root.elementIterator();
        //遍历根节点
        while (itbook.hasNext()){
            Element bookEle = (Element) itbook.next();
            //找到id为1的节点
            if (bookEle.attributeValue("id").equals("1")){
                //删除节点
                bookEle.getParent().remove(bookEle);
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值