Qt Xml文件的创建和解析[xml和dom方式]

news2025/7/6 15:31:47

Qt Xml文件的创建和解析[xml和dom方式]

  • 【1】Qt XML使用说明
  • 【2】Qt XML未来可期
  • 【3】Qt XML文件格式
  • 【4】Qt 读取XML文档的方法
  • 【5】Qt XML解析方式比较
  • 【6】QXmlStreamReader类说明
  • 【7】QXmlStreamWriter类说明
  • 【8】DOM说明
  • 【9】XML常用函数
  • 【10】DOM常用函数
  • 【11】XML和DOM源码
    • XML.pro
    • mainwindow.h
    • mainwindow.cpp
  • 【12】XML和DOM运行结果和输出

在这里插入图片描述

【1】Qt XML使用说明

【1】可扩展标记语言,标准通用标记语言(Extensible Markup Language)的子集,简称XML。
是一种定义电子文档结构和描述其内容的国际标准语言,被设计用来传输和存储数据。
【2】为了避免错误,需要规定 XML 编码,或者将 XML 文档存为 Unicode。
【3】XML文件格式是纯文本格式,在许多方面类似于HTML,XML由XML元素组成.
每个XML元素包括一个开始标记<>,一个结束标记</>以及两个标记之间的内容
【4】XML声明是XML文档的第一句,其格式如下:

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

【5】在XML文档中,大小写是有区别的。
【6】在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。
【7】XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。
【8】空标记“<”标识开始,以“/>”标识结束,如:比如


【2】Qt XML未来可期

【1】XML的简单易于在任何应用程序中读/写数据,这使XML很快成为数据交换的唯一公共语言.
【2】虽然不同的应用软件也支持其他的数据交换格式,但不久之后它们都将支持XML.
【3】那就意味着程序可以更容易的与Windows、Mac OS、Linux以及其他平台下产生的信息结合.
【4】然后可以很容易加载XML数据到程序中并分析它,并以XML格式输出结果。


【3】Qt XML文件格式

【1】XML文档有且只有一个根元素
【2】良好格式的XML文档必须有一个根元素[],就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素.
【3】根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;
【4】根元素的结束标记要放在所有其他元素的结束标记之后[]。


【4】Qt 读取XML文档的方法

【1】QXmlStreamReader:一种快速的基于流的方式访问良格式 XML 文档,特别适合于实现一次解析器(所谓“一次解析器”,可以理解成我们只需读取文档一次,然后像一个遍历器从头到尾一次性处理 XML 文档,期间不会有反复的情况,也就是不会读完第一个标签,然后读第二个,读完第二个又返回去读第一个,这是不允许的);
【2】DOM(Document Object Model):将整个 XML 文档读入内存,构建成一个树结构,允许程序在树结构上向前向后移动导航,这是与另外两种方式最大的区别,也就是允许实现多次解析器(对应于前面所说的一次解析器)。DOM 方式带来的问题是需要一次性将整个 XML 文档读入内存,因此会占用很大内存;
【3】SAX(Simple API for XML):提供大量虚函数,以事件的形式处理 XML 文档。这种解析办法主要是由于历史原因提出的,为了解决 DOM 的内存占用提出的(在现代计算机上,这个一般已经不是问题了)。


【5】Qt XML解析方式比较

三种解析方式比较
1、DOM解析XML文档的特点
基于DOM的解析器的核心是在内存中建立和XML文档相对应的树状结构。
XML文件的标记、标记中的文本数据和实体等都是内存中的树状结构的某个节点相对应。
优点:可以方便地操作内存中的树状节点
缺点:如果XML文件较大,或者只需要解析XML文档的一部分数据,就会占用大量的内存空间

2、流方式解析XML文档的特点
QXmlStreamReader使用了递增式的解析器,适合于在整个XML文档中查找给定的标签、读入无法放入内存的大文件以及处理XML的自定义数据。
优点:快速、方便,分块读取XML文件,可读取大文件
缺点:递增式解析器,只能顺序遍历XML文件的元素,不能随机访问

3、QXmlStreamWriter类提供了简单流接口的XML写入器,写入XML文档只需要调用相应的记号写入函数来写入相关数据。
优点:快速、方便
缺点:只能按顺序写入元素,不能删除、修改


【6】QXmlStreamReader类说明

【1】QXmlStreamReader类提供了一个快速解析器,通过简单的流API读取格式良好的XML 。
【2】QXmlStreamReader从QIODevice或原始QByteArray读取数据。


【7】QXmlStreamWriter类说明

QXmlStreamWriter是用于编写XML的QXmlStreamReader的对等物。
像它的相关类一样,它操作由setDevice()指定的QIODevice。
这个API简单明了:对于您想要编写的每个XML标签或事件,编写器提供一个专门的函数。


【8】DOM说明

DOM(Document Object Model)
DOM 是由 W3C 提出的一种处理 XML 文档的标准接口。Qt 实现了 DOM Level 2 级别的不验证读写 XML 文档的方法。
DOM 一次性读入整个 XML 文档,在内存中构造为一棵树(被称为 DOM 树)。
我们能够在这棵树上进行导航,比如移动到下一节点或者返回上一节点,也可以对这棵树进行修改,或者是直接将这颗树保存为硬盘上的一个 XML 文件。


【9】XML常用函数

//->XML
//如果读取器一直读取到XML文档的末尾,或者发生了error()并中止了读取,则返回true。 否则,返回false。
bool atEnd() const
//如果发生错误则返回true,否则返回false。
bool hasError();
//获取错误码 返回枚举值
QXmlStreamReader::Error error() const
//获取错误字符串
QString errorString() const
//读取下一个标记并返回其类型
QXmlStreamReader::TokenType readNext()
//获取当前读取器的标记类型
QXmlStreamReader::TokenType tokenType() const
//以字符串的形式返回读取器的当前标记类型
QString tokenString() const
//获取标记
QStringRef name() const
//返回字符、注释、DTD或EntityReference的文本。
QStringRef text() const
//获取当前元素的文本(StartElement和EndElement之间的文本)
QString readElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour = ErrorOnUnexpectedElement)
//获取当前元素的属性
QXmlStreamAttributes attributes() const
//例:QXmlStreamAttributes attrs = xmlReader.attributes();
//例:qDebug()<<attrs.value("class").toString()<<attrs.value("name").toString();
//读取当前元素之后的起始元素。 当到达start元素时返回true。 (读取当前元素的子标签)
bool readNextStartElement()
//获取当前元素的属性列表
QXmlStreamAttributes attributes() const

【10】DOM常用函数

//->DOM
//创建属性
QDomAttr createAttribute(const QString &name)
//为可以插入到文档中的字符串值创建一个新的CDATA部分,例如使用QDomNode::appendChild()
QDomCDATASection createCDATASection(const QString &value)
//为可以插入到文档中的字符串值创建一个新的注释,例如使用QDomNode::appendChild()
QDomComment createComment(const QString &value)
//创建一个新的文档片段,可以用来保存文档的部分,例如,当对文档树进行复杂操作时。
QDomDocumentFragment createDocumentFragment()
//创建一个名为tagName的新元素,可以插入到DOM树中,例如使用QDomNode::appendChild()。
QDomElement createElement(const QString &tagName)
//创建一个名为name的新实体引用,可以插入到文档中,例如使用QDomNode::appendChild()。
QDomEntityReference createEntityReference(const QString &name)
//创建一个可以插入到文档中的新的处理指令,例如使用QDomNode::appendChild()。 该函数将处理指令的目标设置为目标,将数据设置为数据。
QDomProcessingInstruction createProcessingInstruction(const QString &target, const QString &data)
//为可以插入到文档树中的字符串值创建一个文本节点,例如使用QDomNode::appendChild()。
QDomText createTextNode(const QString &value)

【11】XML和DOM源码

XML.pro

QT       += core gui xml
#-------------------------------------------------
#
# Project created by QtCreator 2022-11-15T13:40:35
#
#-------------------------------------------------

QT       += core gui xml

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = XML
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11

SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target


mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFile>
#include <QXmlStreamAttribute>  //单属性
#include <QXmlStreamAttributes> //属性列表
#include <QXmlStreamReader> //操作者
#include <QIODevice>    //文件输入输出设备
#include <QDomDocument>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void parseXml(const QString &filename);
    void parseDOM(const QString &filename);

    void XmlStreamWriter(const QString &filename);


private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    XmlStreamWriter("C://Users//DD//Desktop//QT//XML//qxml.xml");//写一个.xml的文件
    parseXml("C://Users//DD//Desktop//QT//XML//qxml.xml");//第一种解析方式
    parseDOM("C://Users//DD//Desktop//QT//XML//qxml.xml");//第二种解析方式
}

MainWindow::~MainWindow()
{
    delete ui;
}
/*
QXmlStreamReader
QXmlStreamReader类提供了一个快速解析器,通过简单的流API读取格式良好的XML 。
QXmlStreamReader从QIODevice或原始QByteArray读取数据。
*/
//xml语法分析  ->按行解析  循环向下直到结束
void MainWindow::parseXml(const QString &filename)
{
    QFile file(filename);
    if(!file.open(QIODevice::ReadWrite|QIODevice::Text))
    {
        qDebug()<<"error open "<<filename.toUtf8().data()<<endl;
        return;
    }
    QXmlStreamReader xmlreader(&file);
    while(!xmlreader.atEnd() && !xmlreader.hasError())
    {
        QXmlStreamReader::TokenType kentype = xmlreader.readNext();
        if(kentype == QXmlStreamReader::TokenType::StartDocument)//第1行
        {
            qDebug()<<"xmlreader.documentEncoding() :"<<xmlreader.documentEncoding();//获取字符编码
        }
#if (1)
        else if(kentype == QXmlStreamReader::TokenType::StartElement)
        {
            if(xmlreader.name() == "HostName")//第3行
            {
                qDebug()<<"元素文本="<<xmlreader.readElementText();
            }
            else if(xmlreader.name() == "Port")//第4行
            {
                qDebug()<<"元素文本="<<xmlreader.readElementText();
            }
            else if(xmlreader.name() == "UserName")//第5行
            {
                qDebug()<<"元素文本="<<xmlreader.readElementText();
            }
            else if(xmlreader.name() == "PassWord")//第6行
            {
                qDebug()<<"元素文本="<<xmlreader.readElementText();
            }
            else if(xmlreader.name() == "DatabaseName")//第7行
            {
                qDebug()<<"元素文本="<<xmlreader.readElementText();
            }
            else//第2行 或其他
            {
                continue;
            }
        }
#endif
    }

}


/*
DOM(Document Object Model)
DOM 是由 W3C 提出的一种处理 XML 文档的标准接口。Qt 实现了 DOM Level 2 级别的不验证读写 XML 文档的方法。
DOM 一次性读入整个 XML 文档,在内存中构造为一棵树(被称为 DOM 树)。
我们能够在这棵树上进行导航,比如移动到下一节点或者返回上一节点,也可以对这棵树进行修改,或者是直接将这颗树保存为硬盘上的一个 XML 文件。
*/

void MainWindow::parseDOM(const QString &filename)
{
    QFile file(filename);
    if(!file.open(QIODevice::ReadWrite|QIODevice::Text))
    {
        qDebug()<<"error open "<<filename.toUtf8().data()<<endl;
        return;
    }
    QString err;
    int errline;
    int errcol;
    QDomDocument dom;
    if(!dom.setContent(&file,false,&err,&errline,&errcol))
    {
        qDebug()<<"解析失败";
        return;
    }
    qDebug()<<"err= "<<err<<" errline= "<<errline<<" errcol= "<<errcol<<endl;
    //获取版本信息和编码信息
    qDebug()<<"节点名="<<dom.firstChild().nodeName()<<"节点值="<<dom.firstChild().nodeValue();

    //获取dom树的根元素(标签)
    QDomElement root = dom.documentElement();
    if(root.tagName() != "root")
    {
        qWarning("根元素不是root,xml文档有误~");
        return;
    }else
    {
        //类比树的结构 进行遍历
        QDomElement node = root.firstChild().toElement();
        while(!node.isNull())
        {
            if(node.tagName() == "HostName")
            {
                qDebug()<<"HostName="<<node.text();
            }
            else if(node.tagName() == "Port")
            {
                qDebug()<<"Port="<<node.text();
                QDomElement subNode = node.firstChildElement();//模拟本节点下是否还具有其子节点
                while(!subNode.isNull())
                {
                    if(subNode.tagName() == "a")
                    {
                        qDebug()<<subNode.text();
                    }
                    else if(subNode.tagName() == "fuck")
                    {
                        qDebug()<<subNode.text();
                    }
                    subNode = subNode.nextSiblingElement();
                }
            }
            else if(node.tagName() == "UserName")
            {
                qDebug()<<"UserName="<<node.text();
            }
            else if(node.tagName() == "PassWord")
            {
                qDebug()<<"PassWord="<<node.text();
            }
            else if(node.tagName() == "DatabaseName")
            {
                qDebug()<<"DatabaseName="<<node.text();
            }
            //如果标记名非空,则返回具有标记名标记名的下一个兄弟元素,否则返回任何下一个兄弟元素。如果不存在这样的兄弟姐妹,则返回一个空元素。
            node = node.nextSiblingElement();
        }
    }
}

/*
QXmlStreamWriter是用于编写XML的QXmlStreamReader的对等物。
像它的相关类一样,它操作由setDevice()指定的QIODevice。
这个API简单明了:对于您想要编写的每个XML标签或事件,编写器提供一个专门的函数。
*/
void MainWindow::XmlStreamWriter(const QString &filename)
{
    QFile file(filename);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text|QIODevice::Truncate))
    {
        qWarning("文件打开失败");
        return ;
    }

    QXmlStreamWriter writer(&file);
    writer.setAutoFormatting(true);//设置自动格式化 缩进和自动换行等

    writer.writeStartDocument("1.0");//Start dom[1]

    writer.writeStartElement("root");
    writer.writeTextElement("HostName","localhost");
    writer.writeTextElement("Port","3306");
    writer.writeTextElement("UserName","root");
    writer.writeTextElement("PassWord","123456789");

    writer.writeStartElement("widget");
    writer.writeAttribute("class","QWidget");
    writer.writeAttribute("name","MainWindow");

    writer.writeComment("helo");                //写注释

    writer.writeStartElement("property");
    writer.writeAttribute("name","property");

    writer.writeStartElement("rect");
    writer.writeTextElement("x","0");
    writer.writeTextElement("y","0");
    writer.writeTextElement("width","640");
    writer.writeTextElement("height","480");

    writer.writeEndElement();   // end widget
    writer.writeEndElement();   // end property
    writer.writeEndElement();   // end rect

    writer.writeEndElement();   //end ui

    writer.writeEndDocument();  //end dom[1]
    file.close();
}



【12】XML和DOM运行结果和输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <HostName>localhost</HostName>
    <Port>3306</Port>
    <UserName>root</UserName>
    <PassWord>123456789</PassWord>
    <widget class="QWidget" name="MainWindow">
        <!--helo-->
        <property name="property">
            <rect>
                <x>0</x>
                <y>0</y>
                <width>640</width>
                <height>480</height>
            </rect>
        </property>
    </widget>
</root>

在这里插入图片描述


在这里插入图片描述

END 2022-11-15

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

摊牌了,请各位做好一年内随时失业的准备

前两天跟一个HR朋友聊天&#xff0c;她表示刚在boss上发布了一个普通测试岗位&#xff0c;不到一小时竟然收到了几百份简历。而且简历质量极高&#xff0c;这是往年不敢想象的。岗位少&#xff0c;竞争激烈&#xff0c;这是今年软件测试就业的真实写照&#xff0c;也是所有岗位…

Python开发环境及常用Web框架

Python Python是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python 优雅的语法和动态类型以及解释型语言的本质&#xff0c;使它成为多数平台上写脚本和快速开发应用的理想语言。 吉多范罗苏姆&#xff08;Guido…

基于Postmate实现的跨域通信

1、Postmate 介绍 是一款基于 postMessage 来处理父子页面通信的库&#xff0c;轻量且好用。一个强大的、简单的、基于 promise 的 postMessage iFrame 通信库。 postmate 官方地址 https://github.com/dollarshaveclub/postmate 2、Postmate 特性 基于 promise 的 API&…

如何将数字改为千分符且保留两位小数显示?toLocaleString()和toFixed(2)踩坑

前言 基于现代Web前端框架的应用&#xff0c;其原理是通过浏览器向服务器发送网络请求&#xff0c;获取必要的index.html和打包好的JS、CSS等资源&#xff0c;在浏览器内执行JS&#xff0c;动态获取数据并渲染页面&#xff0c;从而将结果呈现给用户。在这个过程中&#xff0c;…

【java学习】 static

文章目录成员变量static 工具类static 代码块设计模式继承重写成员变量 1&#xff0e;成员变量的分类和访问分别是什么样的? 静态成员变量&#xff08;有static修饰&#xff0c;属于类、加载一次&#xff0c;可以被共享访问)&#xff0c;访问格式 类名.静态成员变量(推荐) 对…

R语言七天入门教程六:文件相关操作

R语言七天入门教程六&#xff1a;文件相关操作 一、文件的读写 R 语言作为统计学编程语言&#xff0c;常常需要处理大量数据&#xff0c;而这些数据通常会从文件中进行读取&#xff0c;因此文件读写在R语言中是非常重要的操作。在R语言中&#xff0c;用到最多的文件格式是csv…

Carla安装记录

Carla安装记录 最近打算在做一些自动驾驶相关的东西&#xff0c;所以安装了一下Carla。在这里记录一些自己的安装过程中遇到的一些问题和解决的方法。 Carla release版本下载 想要安装Carla&#xff0c;可以选择release版本或者源码安装。在这里我主要介绍release版本的安装…

Vue3、vite项目页面自适应配置(postcss-plugin-px2rem、amfe-flexible)

文章目录前言&#xff1a;vite 如何处理 csspostcss项目配置下载相关包配置方案一方案二&#xff08;备选方案&#xff09;相关资料链接前言&#xff1a;vite 如何处理 css vite 天生就支持对css文件的直接处理 关于预处理器 ☀️目前&#xff0c;在工程化开发中&#xff0c;使…

AcWing-C/C++语法基础【合集2】

5.字符串 每个常用字符都对应一个-128~127的数字 &#xff0c;二者之间可以相互转化&#xff1a; (int)97 , (char)a 常用ASCII值&#xff1a;’A’-‘Z’ 是65~90&#xff0c;’a’-‘z’是97-122&#xff0c;’0’-‘9’是 48-57 字符可以参与运算&#xff0c;运算时会将其当…

2022年11月编程排行榜

2022年11月Tiobe编程排行榜已更新&#xff0c;研一的生涯也快结束&#xff0c;来看一下本月各大编程语言有何新进展&#xff1a; 目录&#xff1a;11月编程排行榜一、榜单情况二、榜单简单的分析一、榜单情况 这里只展示排名靠前的前15名&#xff1a; TOP 10编程语言TIOBE指数…

播放视频出现错误代码0xc00d36c4如何修复?

相信很多用户都遇到过视频无法播放的问题。比如将重要视频从旧电脑拷到U盘上&#xff0c;使用另一台电脑播放时&#xff0c;提示视频播放错误代码0xc00d36c4&#xff0c;不支持该视频播放。 其实&#xff0c;视频无法播放的问题是很常见的&#xff0c;不少用户将相机或者手机上…

机器学习的初学术语掌握

机器学习&#xff1a;让一个模型能够通过数据调优自己&#xff0c;后续的数据可以通过模型获得更贴近真实的结论数据集&#xff1a;也叫样本&#xff0c;可以简单理解为一个个对象构建成的集合训练样本&#xff1a;构建的数据集中的一部分被拿来训练模型的子集标记&#xff1a;…

计算机网络面试题

1. TCP建⽴连接的过程。 三次握⼿&#xff1a; 1. 第⼀次握⼿(客户端发送syn包到服务器端)&#xff1a;客户端发送syn包到服务器端&#xff0c;进⼊syn_send状态&#xff0c;等待服务器端的确认&#xff1b; 2. 第⼆次握⼿(服务器返回synack包给客户端)&#xff1a;服务器端…

Js逆向教程-08跟值技巧

Js逆向教程-08跟值技巧 一、加密函数最有可能出现在哪里&#xff1f; 一般不会出现在jquery成熟的第3仓库里面。 jquery是封装好的成熟的第3仓库&#xff0c;一般不会去修改它。 因为如果jquery版本提升了&#xff0c;还要去改jquery。 一般会出现在自己写的js代码中&#x…

LabVIEW性能和内存管理 3

LabVIEW性能和内存管理 3 本文介绍LabVIEW性能和内存管理的几个建议3。 显示缓冲区分配。 “显示缓冲区分配”工具位于工具>配置文件>显示缓冲区分配 In Place优化例程。对波形数组的每个元素进行操作 下面是如何使用ShowBuffer allocation工具提高性能的示例。从层次…

HashMap的面试题

目录 1、底层数据结构 1.7和1.8有何不同 2、为什么用红黑树&#xff0c;为何不一上来就树化&#xff0c;树化阈值为何是8&#xff0c;何时会树化&#xff0c;何时会退化为链表 3、索引如何计算&#xff1f;hashCode都有了&#xff0c;为何还要提供hash()方法&#xff1f;数组…

综合实验——高级网络应用检测

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 综合实验 实验要求 三层交换机配置 三层交换机一 三层交换机…

教程详解从照片到倾斜摄影模型、影像地形点云的成果输出,网页端Web发布展示

一、数据获取 需要自己在下面网址中下载相应数据&#xff0c;获取the island of Torbjrnskjr&#xff0c;下载后&#xff0c;共计200张带pos的jpg照片&#xff0c;存储到纯英文目录下 国外Sensefly共享的航拍数据 包括数据原片、分辨率介绍、覆盖范围&#xff0c;飞行高度、照…

Linux-实操篇8-shell脚本编写

一、shell是什么 二、shell脚本如何执行 2.1 新建一个shell脚本 ## 第一步新建一个shell脚本 vim aaa.sh ## 内容如下&#xff0c;#!/bin/bash 表示shell脚本的执行协议&#xff0c;必须要写 #!/bin/bash echo "hello word!!!"2.2 执行方式 方式一&#xff1a;先给…

R语言中的函数19:openxlsx::read.xlsx(), write.xlsx(), writeData(), writeDataTable()

文章目录read.xlsx()函数介绍实例writeData()和writeDataTable()函数介绍实例write.xlsx()函数介绍实例read.xlsx()函数介绍 read.xlsx(xlsxFile,sheet,startRow 1,colNames TRUE,rowNames FALSE,detectDates FALSE,skipEmptyRows TRUE,skipEmptyCols TRUE,rows NULL,c…