语法篇--XML数据传输格式

一、XML概述

1.1简介

XML,全称为Extensible Markup Language,即可扩展标记语言,是一种用于存储和传输数据的文本格式。它是由W3C(万维网联盟)推荐的标准,广泛应用于各种系统中,如Web服务、数据库、移动应用等。与HTML相比,XML不是用于显示数据的,而是用于存储和传输数据,其语法结构更为严谨,可以支持自定义的标签和属性。

XML的语法规则很简单,由开始标签、结束标签、元素内容和属性组成。开始标签和结束标签使用尖括号括起来,元素内容位于开始标签和结束标签之间,属性则包含在开始标签中。XML文档的根元素是唯一的,所有其他元素都是其子元素。XML还可以使用DTD(文档类型定义)和XML Schema等方式定义文档的结构和内容约束。

由于XML的语法严谨、自定义标签和属性以及可扩展性等特点,使其成为一种流行的数据格式。它在Web服务中广泛应用,如SOAP协议、RESTful Web服务等,也用于配置文件、数据交换、文档传输等场景。

1.2用途

a.程序之间的数据传输通讯
PHP语言<- 快递100 <- Java 语言
b.配置文件config. xml
config. xm1 -> php语言、java语言、Python语言
c.存储数据,充当小型数据库
data. xml

由于XML具有通用性、可扩展性和可读性等特点,因此被广泛用于描述和存储各种类型的数据,如文本、图片、音频、视频、配置文件等。XML还被广泛应用于Web服务、企业应用集成、电子商务、电子出版、数据交换等领域。

1.3什么是XML

XML被发明的目的是传输和存储数据,而不是展示数据;
XML的标签必须自定义,但是在写标签名的时候一定要有含义;

1.4为什么需要XML

 1.5快速入门

1.6扩展技术

1.6.1DTD

1.6.2XSD 

1.6.3XSL

 二、XML的解析

2.1XML的解析方法

2.2Dom处理方法

其处理方式是将XML整个作为类似树结构的方式读入内存中以便操作及解析,方便修改。
解析大数据量的XML文件,会遇到内存泄露及程序崩溃的风险。 

2.3 DOM类解析

2.4DOM读xml文件

package org.example;


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;

import java.io.File;

public class Main {
    public static void main(String[] a) {
        recursiveTraverse(); //自上而下进行访问
        System.out.println("========华丽丽的分割线=======");
        traverseBySearch(); //根据名称进行搜索
    }

    public static void recursiveTraverse() {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse(new File("D:\\workspace-java\\untitled4\\users.xml"));

            NodeList usersList = document.getChildNodes();
            for (int i = 0; i < usersList.getLength(); i++) {
                Node users = usersList.item(i);
                NodeList userList = users.getChildNodes();
                for (int j = 0; j < userList.getLength(); j++) {
                    Node user = userList.item(j);
                    if (user.getNodeType() == Node.ELEMENT_NODE) {
                        NodeList metaList = user.getChildNodes();
                        for (int k = 0; k < metaList.getLength(); k++) {
                            Node meta = metaList.item(k);
                            if (meta.getNodeType() == Node.ELEMENT_NODE) {
                                System.out.println(meta.getNodeName()
                                        + ":" + meta.getTextContent());
                            }
                        }
                        System.out.println();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void traverseBySearch() {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse(new File("D:\\workspace-java\\untitled4\\users.xml"));

            org.w3c.dom.Element rootElement = document.getDocumentElement();
            NodeList nodeList = rootElement.getElementsByTagName("name");
            if (nodeList != null) {
                for (int i = 0; i < nodeList.getLength(); i++) {
                    org.w3c.dom.Element element = (org.w3c.dom.Element) nodeList.item(i);
                    System.out.println(element.getNodeName() + " = " + element.getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 2.5DOM写xml文件

package org.example;


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 = dbBuilder.newDocument();

            if (document != null) {
                Element docx = document.createElement("document"); // 创建名为 "document" 的元素
                Element element = document.createElement("element");
                element.setAttribute("type", "paragraph");
                element.setAttribute("alignment", "left"); // 为 element 增加属性
                Element object = document.createElement("object");
                object.setAttribute("type", "text");

                Element text = document.createElement("text");
                text.appendChild(document.createTextNode("abcdefg")); // 为 text 节点赋值
                Element bold = document.createElement("bold");
                bold.appendChild(document.createTextNode("true")); // 为 bold 节点赋值

                object.appendChild(text); // 将 text 节点挂在 object 下
                object.appendChild(bold); // 将 bold 节点挂在 object 下
                element.appendChild(object); // 将 object 节点挂在 element 下
                docx.appendChild(element); // 将 element 节点挂在 docx 下
                document.appendChild(docx); // 将 docx 挂在 document 下

                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();
                DOMSource source = new DOMSource(document);

                // 定义目标文件
                File file = new File("dom_result.xml");
                StreamResult result = new StreamResult(file);

                // 将 XML 内容写入文件中
                transformer.transform(source, result);
                System.out.println("Write XML file successfully");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.6SAX处理方法

package org.example;


import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class SAXReader {
    public static void main(String[] args) {
        try {
            XMLReader parser = XMLReaderFactory.createXMLReader();
            BookHandler bookHandler = new BookHandler();
            parser.setContentHandler(bookHandler);
            parser.parse("books.xml");
            System.out.println(bookHandler.getNameList());
        } catch (SAXException | IOException e) {
            e.printStackTrace();
        }
    }
}

class BookHandler extends DefaultHandler {
    private List<String> nameList;
    private boolean title = false;

    public List<String> getNameList() {
        return nameList;
    }

    // xml文档加载时
    public void startDocument() {
        System.out.println("Start parsing document...");
        nameList = new ArrayList<>();
    }

    // 文档解析结束
    public void endDocument() {
        System.out.println("End");
    }

    // 访问某一个元素
    public void startElement(String uri, String localName, String qName, Attributes atts) {
        if (qName.equals("title")) {
            title = true;
        }
    }

    // 结束访问元素
    public void endElement(String namespaceURI, String localName, String qName) {
        if (title) {
            title = false;
        }
    }

    // 访问元素正文
    public void characters(char[] ch, int start, int length) {
        if (title) {
            String bookTitle = new String(ch, start, length).trim();
            if (!bookTitle.isEmpty()) {
                System.out.println("Book title: " + bookTitle);
                nameList.add(bookTitle);
            }
        }
    }
}

2.7STAX处理方法

2.8其他第三方库

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/87447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本…

Java“牵手”虾皮商品详情数据,根据商品ID获取虾皮(Shopee商品详情数据接口,虾皮API接口申请指南

虾皮&#xff08;shopee&#xff09;商城是一个跨境网上批发购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取虾皮商品详情数据&#xff0c;您可以通过开放平台的接口或者直接访问虾皮商城的网页来获取商品详情信息。以下…

vim 配置环境变量与 JDK 编译器异常

vim 配置环境变量 使用 vim 打开系统中的配置信息&#xff08;不存在将会创建&#xff09;&#xff1a; vim ~/.bash_profile 以配置两个版本 JDK 为例&#xff08;前提是已安装 JDK&#xff09;,使用上述命令打开配置信息&#xff1a; 输入法调成英文&#xff0c;输入 i&…

低压风机单片机方案

低压风机通常由电机、转子、机壳、进气管、出气管、齿轮和减速机等组成。电机带动转子旋转&#xff0c;旋转的转子带动齿轮和减速机转动&#xff0c;进而形成空气被吸入转子内部&#xff0c;通过旋转而产生的离心力把气体压缩&#xff0c;并将气体排出。 低压风机方案的主控型…

设置p标签中的内容不换行展示

设置p标签中的内容不换行展示 /*不换行*/white-space: nowrap;/*多余的部分以顶点点点的形式进行展示*/text-overflow: ellipsis;/*隐藏多余的部分*/overflow: hidden;效果图

微服务中间件--统一网关Gateway

统一网关Gateway 8.统一网关Gatewaya.搭建网关服务b.路由断言工厂c.路由过滤器GatewayFilterd.全局过滤器GlobalFiltere.过滤器的执行顺序f.网关的cors跨域配置 8.统一网关Gateway 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现 在Spr…

Unity 之 Transform.Translate 实现局部坐标系中进行平移操作的方法

文章目录 Translate 默认使用局部坐标也可以转换成世界坐标 Translate 默认使用局部坐标 在Unity中&#xff0c;Transform.Translate是用于在游戏对象的局部坐标系中进行平移操作的方法。这意味着它将游戏对象沿着其自身的轴进行移动&#xff0c;而不是世界坐标轴。这在实现物…

docker 搭建 ElasticSearch

1、拉取镜像 docker pull elasticsearch:8.8.12、在机器本地新建文件夹并赋予权限 mkdir -p /home/elasticsearch/configmkdir -p /home/elasticsearch/datamkdir -p /home/elasticsearch/pluginschmod 777 /home/elasticsearch/configchmod 777 /home/elasticsearch/datachm…

安卓系列机型-禁止卸载某个APP 防止误卸载软件 无需root权限

安卓系列机型-禁止安装某软件 防止“沉迷游戏的小孩”操作解析_安卓机器的博客-CSDN博客 上一期讲了如何禁止安装某个app。今天讲下如何禁止卸载某app。正好相反的操作。任何操作有利有弊。主要看使用者如何对待使用。 &#x1f494;&#x1f494;&#x1f494;以腾讯的一款游…

ICCV2023 | 基于动作敏感性学习的时序动作定位

淘天集团-内容理解算法团队与浙江大学杨易教授团队合作的关于视频时序定位的论文被ICCV2023录取。 本文在业界首次将视频帧级别的细粒度信息引入至时序动作定位领域&#xff08;Temporal Action Localization&#xff0c;TAL&#xff09;&#xff0c;对于时序动作定位任务&…

appium2.0+ 单点触控和多点触控新的解决方案

在 appium2.0 之前&#xff0c;在移动端设备上的触屏操作&#xff0c;单手指触屏和多手指触屏分别是由 TouchAction 类&#xff0c;Multiaction 类实现的。 在 appium2.0 之后&#xff0c;这 2 个方法将会被舍弃。 "[Deprecated] TouchAction action is deprecated. Ple…

Docker基本部署和相关操作

1.安装docker服务&#xff0c;配置镜像加速器 1、yum安装并且添加源信息 yum install yum-utils device-mapper-persistent-data lvm2 -y yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo2、修改一些配置信息 sed…

Ajax+Vue+ElementUI

文章目录 1.Ajax1.1 介绍1.2 Ajax快速入门1.3 案例-用户注册时&#xff0c;检测用户名是否数据库已经存在1.4 Axios1.4.1 Axios快速入门1.4.2 请求别名 1.5 JSON1.5.1 Json的基础语法1.5.2 FastJson的使用5.3.2 Fastjson 使用 2. Vue2.1 介绍2.2 Vue快速入门2.3 Vue常用指令和生…

SpringBoot 调用外部接口

SpringBoot 调用外部接口 一、第一种方式(HttpClient等) 使用插件方式&#xff0c;比如自带的HttpClient&#xff0c;或者OkHttp&#xff0c;甚至是原生的HttpURLConnection 等等&#xff0c;这里以HttpClient为例。 1、封装工具类 简单封装的get请求 /*** 发送get请求:带请求…

软年架构复用-架构师之路(十一)

软件架构复用 软件产品线是 一组产业密集型系统&#xff0c;规定用公用的 核心资产集成 开发而来。 机会复用 和 系统复用。 机会复用&#xff1a;临时发现有可服用资产立马复用。 系统复用&#xff1a;开发之前进行规划好哪些需要复用。 复用的三个阶段&#xff1a; 获取到…

配置禁止生成可执行文件-火绒法

防止黑客利用漏洞上传可执行文件的方法&#xff0c;可以尝试通过文件服务器资源管理器(FSRM)设置文件屏蔽防止黑客利用漏洞上传特定类型的非法文件(.asp .aspx .jsp .php)。要是系统问题不能使用(FSRM)&#xff0c;可以用火绒来干这个事儿。方法如下&#xff1a; 配置方法 火…

Vue报错 TypeError: this.getOptions is not a function

一般而言这是因为sass而报出来的错误 我们先删除node_modules&#xff0c;然后重新安装依赖 如果使用的是node-sass&#xff0c;则需要考虑正确的版本 示例 npm install sass-loader7.3.1 node-sass4.14.1 --save-dev 如果使用的是sass&#xff0c;则使用以下命令 npm i -…

springboot2+redis 订阅发布,解决接收消息累计线程到内存溢出,使用自定义线程池接收消息

pom 添加redis <!-- redis 缓存操作 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 发布消息 import lombok.extern.slf4j.Slf4j; import o…

HTTP协议(JavaEE初阶系列15)

目录 前言&#xff1a; 1.HTTP协议 1.1HTTP协议是什么 1.2HTTP协议的报文格式 1.2.1抓包工具的使用 1.2.2HTTP请求 1.2.3HTTP响应 2.HTTP请求 2.1首行的组成 2.2.1URL的组成 2.2认识“方法”&#xff08;method&#xff09; 2.2.1GET方法 2.2.2POST方法 2.2.3GET…

内网安全:WMI协议与SMB协议横向移动

目录 网络拓扑图 网络环境说明 WMI协议 SMB协议 域内信息收集 WMI协议 - 横向移动 利用方式一&#xff1a;wmic命令 利用方式一&#xff1a;cscript 利用方式一&#xff1a;impacket SMB协议 - 横向移动 利用方式一&#xff1a;psexec 利用方式二&#xff1a;psexe…