XML

什么是XML?

我通常是理解为解释数据的文件,例如,给出单独一个[20]的数据,我们并不知道这是什么东西,但如果是[age,20],我们就能稍微理解一下年龄是20岁,在稍微拓展一下[Student,name,tom,age,20],能够将其阅读为一个名叫tom的学生年纪为20岁,如果用XML的风格将其书写的话则如下图

<Student>
	<name>tom</name>
	<age>20</age>
</Student>

XML常规语法

  • 任何的起始标签都必须有一个结束标签
  • 可简化写法,例如< name >< /name > 可以写为< name/ >
  • 大小写敏感,如< name > 和 < Name >是不一样的
  • 每个文件都要有个根元素
  • 标签必须按合适的顺序进行嵌套
  • 有特性就必须有值,且在值的周围加上引号
  • 有转义字符,如“<”需要则用& lt;代替
    在这里插入图片描述

DOM方法解析XML

DOM:Document Object Model 文档对象模型,擅长小规模的XML文件读写。

前提须知

这里给一个简单的XML文件

<font>
	<name>Helvetica</name>
	<size>36</size>
</font>

其通过DOM形式来表达如下:
在这里插入图片描述
Document是根元素
然后接下来就可以看到font,而font中只有name和size是我们XML文件中本来就有的,whitespace是什么呢,我这里来解释一下

<font>
	这里含有一个whitespace
	<name>Helvetica</name>
	这里含有一个whitespace
	<size>36</size>
	这里含有一个whitespace
</font>

后面我们利用DOM方式解析时,去获得数据或者遍历时,需要了解他是有个whitespace,那个并不是我们需要去获取的。

DOM类

主要是通过DocumentBuilder的parse方法进行解析

Node是节点的主接口,Node中有个方法getChildNodes返回的是一个NodeList,简单来说就是条用该方法可以获取该节点的所有的子节点

当我们去便利NodeList节点列表的时候,我们又可以通过item()方法拿出里面的每个元素Node。

Node利用getChildNodes获取到NodeList,接着NodeList遍历获得Node,Node再用getChildNodes去获得,以此反复,便可以获得XML文件中所有的数据

Document为文档根节点
Element为标签节点元素(每一个标签都是标签节点)

DOM类例子(自上而下遍历进行访问)

首先创建一个XML文件,我这里取名为users.xml,内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<student>

    <name>Tom</name>

    <subject>math</subject>

    <score>80</score>

</student>

接着Java代码如下:

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

public class DomReader {
    public static void main(String[] args) {
        recursiveTraverse();
    }
    public static void recursiveTraverse(){
        try {
            //采用Dom解析XML文件(基本这三句是固定格式)
            DocumentBuilderFactory  DBF=DocumentBuilderFactory.newInstance();
            DocumentBuilder DB=DBF.newDocumentBuilder();
            Document document=DB.parse("users.xml");
            //根元素
            System.out.println("DOM形式下第一个节点标签document:"+document.getNodeName());

            //获取根元素下的节点并将其遍历
            NodeList list=document.getChildNodes();
            for (int i = 0; i < list.getLength(); i++) {
                Node Node=list.item(i);
                System.out.println("document下的子节点:"+Node.getNodeName());

                //获取student标签下的元素并遍历
                NodeList list2=Node.getChildNodes();
                for (int j = 0; j < list2.getLength() ; j++) {
                    Node Node2=list2.item(j);
                    //排除获得到的#text,即空值
                    if(Node2.getNodeType()==Node.ELEMENT_NODE)
                    {
                        NodeList resultList=Node2.getChildNodes();
                        for (int k = 0; k < resultList.getLength(); k++) {
                            Node result=resultList.item(k);
                            System.out.println("Student下的子节点"+Node2.getNodeName()+":"+result.getTextContent());
                        }
                    }
                }
            }
        }catch (Exception error){
            System.out.println(error);
        }
    }
}

显示效果如下:
在这里插入图片描述

DOM类例子(查标签名进行访问)

首先创建一个XML文件,我这里取名为users.xml,内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<student>

    <name>Tom</name>

    <subject>math</subject>

    <score>80</score>

</student>

java代码如下:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

                        public class DomReader {
                            public static void main(String[] args) {
                                //查名取值
                                traverseBySearch();
                            }
                        


    public static void traverseBySearch(){
                                try {
                                    //采用Dom解析XML文件(基本这三句是固定格式)
                                    DocumentBuilderFactory  DBF=DocumentBuilderFactory.newInstance();
                                    DocumentBuilder DB=DBF.newDocumentBuilder();
                                    Document document=DB.parse("users.xml");
                                    //根元素
                                    System.out.println("DOM形式下第一个节点标签document:"+document.getNodeName());

                                    //获取Student节点
                                    Element element=document.getDocumentElement();
                                    System.out.println(element.getNodeName());
                                    //寻找所有Student节点下name,subject,score标签名的节点
                                    NodeList nameList=element.getElementsByTagName("name");
                                    NodeList subjectlist=element.getElementsByTagName("subject");
                                    NodeList scoreList=element.getElementsByTagName("score");
                                    for (int i = 0; i < nameList.getLength(); i++) {
                                        System.out.println("名字="+nameList.item(i).getTextContent()+"  学科"+subjectlist.item(i).getTextContent()+"  成绩:"+scoreList.item(i).getTextContent());
                                    }
                                }catch (Exception e){

                                }
    }




}


显示效果如下:
在这里插入图片描述

DOM例子(写DOM文件)

import org.w3c.dom.Document;
import org.w3c.dom.Element;

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

public class DomWriter {
    public static void main(String[] args) {
        try {
            //固定格式
            DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
            DocumentBuilder dbBuilder=dbFactory.newDocumentBuilder();

            //新创建一个Document节点,同时后面的元素都采用Document创建元素
            Document document=dbBuilder.newDocument();
            if(document!=null){
                Element docx=document.createElement("document");
                Element element=document.createElement("student");
                element.setAttribute("type","paragraph");
                element.setAttribute("alignment","left"); //为element添加两个属性

                //设置student下的节点
                Element name=document.createElement("name");
                name.appendChild(document.createTextNode("tom"));
                Element subject=document.createElement("subject");
                subject.appendChild(document.createTextNode("math"));
                Element score=document.createElement("score");
                score.appendChild(document.createTextNode("95"));

                //将标签分别设置在下面
                element.appendChild(name);
                element.appendChild(subject);
                element.appendChild(score);
                docx.appendChild(element);
                document.appendChild(docx);
                //创建完DOM接着(固定格式)
                TransformerFactory transformerFactory= TransformerFactory.newInstance();
                Transformer transformer=transformerFactory.newTransformer();
                DOMSource source=new DOMSource(document);
                //目标文件
                File file=new File("users.xml");
                StreamResult result=new StreamResult(file);
                //将xml内容写道文件中
                transformer.transform(source,result);
                System.out.println("修改成功");
            }
        }catch (Exception error){
            System.out.println(error);
        }
    }
}

显示效果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值