Qt通过Doc模式读取XML并设计一个增删改查方便的操作类

前言

如果对开源库TinyXml有兴趣的可以去看看这篇文章。
C++使用TinyXml(开源库)读取*.XMl文件

DOC 文档对象模型

文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。它是一种与平台和语言无关的应用程序接口(API),它可以动态地访问程序和脚本,更新其内容、结构和www文档的风格(HTML和XML文档是通过说明部分定义的)。文档可以进一步被处理,处理的结果可以加入到当前的页面。

DOM是一种基于树的API文档,它要求在处理过程中整个文档都表示在存储器中。另外一种简单的API是基于事件的SAX,它可以用于处理很大的XML文档,由于大,所以不适合全部放在存储器中处理。

先来了解一下xml基本要素:
在这里插入图片描述

QtXML基本结构

下面列出了Qt处理xml的一些类以及说明,加粗表示是常用。

类名说明
QDomAttrThe QDomAttr class represents one attribute of a QDomElement
QDomNodeThe QDomNode class is the base class for all the nodes in a DOM tree.
QDomTextThe QDomText class represents text data in the parsed XML document.
QDomElementThe QDomElement class represents one element in the DOM tree.
QDomCDATASectionThe QDomCDATASection class represents an XML CDATA section
QDomCharacterDataThe QDomCharacterData class represents a generic string in the DOM
QDomCommentThe QDomComment class represents an XML comment
QDomDocumentThe QDomDocument class represents an XML document
QDomDocumentFragmentThe QDomDocumentFragment class is a tree of QDomNodes which is not usually a complete QDomDocument.
QDomEntityThe QDomEntity class represents an XML entity.

操作XML

部署环境

通过Qt Create创建一个工程。然后在*.pro配置文件中添加xml model。
在这里插入图片描述
在添加Qt解析xml相关的头文件

#include <QtXml>
#include <QDomDocument>

添加信息头

	// xml文档
	QDomDocument* m_Doc = new QDomDocument(); 
	
    // 创建XML处理类,通常用于处理第一行描述信息
    QDomProcessingInstruction instruction;

    std::string note =  "version=1.0 encoding=utf-8";

    // 创建XML头部格式
    instruction = m_Doc->createProcessingInstruction(QString::fromStdString(type), QString::fromStdString(note));

    // 添加到XML文件中
    m_Doc->appendChild(instruction);

读取XML文件

    // 打开文件
    QFile m_File = new QFile("./1.xml");

    if (false == m_File->open(mode))
    {
        QMessageBox::information(NULL, u8"提示", u8"文件打开失败!");
        return;
    }

    // 将doc与file关联起来
    // 这个函数从IO设备dev中读取XML文档,如果内容被成功解析,则返回true;否则返回false。
    if (false == m_Doc->setContent(m_File))
    {
        QMessageBox::information(NULL, u8"提示", u8"操作的文件不是XML文件!");
        m_File->close();
        return ;
    }

添加根节点

通过createElement方法创建的第一个子节点就是根节点。然后通过appendChild方法将创建的节点添加到doc中。

    // 创建根节点
    QDomElement rootNode = m_Doc->createElement(rootName);

    // 添加到XML文件中
    m_Doc->appendChild(rootNode);

添加一个没有属性的节点

添加一个没有属性的节点的方法和添加根节点的方法一致。

    // 创建根节点
    QDomElement rootNode = m_Doc->createElement(rootName);

    // 添加到XML文件中
    m_Doc->appendChild(rootNode);

添加一个有属性的节点

    std::list<std::pair<std::string, std::string>> Attribute{{"ID","2"},{"name","张三"}};
    QDomElement node = m_Doc->createElement(nodeName);

    // 给节点创建属性
    for(const auto& elem : Attribute)
    {
        // 参数一是字符串,参数二可以是任何类型
        node.setAttribute(QString::fromStdString(elem.first), QString::fromStdString(elem.second));
    }

    rootNode.appendChild(node);

添加一个元素节点

    // 创建子元素
    QDomElement node = m_Doc->createElement(nodeName);

    // 设置尖括号中的值
    QDomText text = m_Doc->createTextNode(value);

    // 添加关系
    node.appendChild(text);
    root.appendChild(node);

给节点单独设置属性

setAttribute方法设置节点的属性名和属性值。

    QDomElement elemNode = m_Doc->createElement(QString::fromStdString(name));

    elemNode.setAttribute(QString::fromStdString(name), QString::fromStdString(value));

    node.appendChild(elemNode);

删除所有同名节点

removeChild方法使用需要注意

看下面官方文档说明

Removes oldChild from the list of children. oldChild must be a direct child of this node.
Returns a new reference to oldChild on success or a null node on failure.

类似于C++容器存在迭代器失效问题。所以我这里就从后向前删除了。

    // 获取节点名字为Book的所有节点
    QDomNodeList nodes = m_Doc->elementsByTagName(nodeName);

    for (int i = nodes.size() - 1; i >= 0; i--)
    {
        // 获取节点
        QDomElement element = nodes.at(i).toElement();
        
         //   所以 要么从后向前删除 要么就需要重新指定新节点的位置
        root.removeChild(element);
    }

删除所有同名带属性的节点

    QDomNodeList nodes = m_Doc->elementsByTagName(nodeName);

    for (int i = 0; i < nodes.count(); i++)
    {
        // 获取节点
        QDomElement element = nodes.at(i).toElement();

        bool isFind {true};
        for(const auto& elem : attribute)
        {
            // 进行判断(返回属性的值进行判断)
            if (element.attribute(QString::fromStdString(elem.first)) != QString::fromStdString(elem.second))
            {
                isFind = false;
            }
        }
        if(true == isFind)
        {
            root.removeChild(nodes.at(i));
        }
    }

递归删除所有同名的节点

    // 获取节点名字为Book的所有节点
    QDomNodeList nodes = m_Doc->elementsByTagName(QString::fromStdString(nodename));

    // QDomElement root = GetRootNode();

    for (int i = nodes.size() - 1; i >= 0; i--)
    {
        // 获取节点
        QDomElement element = nodes.at(i).toElement();
        
        // 获取父节点
        QDomNode fNode = element.parentNode();
        
        fNode.removeChild(element);
    }

保存XML

    QFile* m_File= new QFile(fileName);
    if (false == m_File->open(QFileDevice::WriteOnly | QFileDevice::Truncate))
    {
        QMessageBox::information(NULL, "提示", "文件打开失败!");
        return;
    }
    QTextStream stream(m_File);
    m_Doc->save(stream, retract);

获取节点元素

if (node.toElement().tagName() == name)
{
    return node;
}

获取节点元素的值

if (node.toElement().tagName() == name)
{
    return node.toElement().text().toStdString();
}

获取该节点的属性值

key为属性名

if (false == node.isNull() && true == node.toElement().hasAttribute(key))
{
value = node.toElement().attributeNode(key).value();
}

完整代码

注:必须支持C++17

OperateXML.h

#ifndef OPERATEXML_H
#define OPERATEXML_H

// 读取xml必须要包含的
#include <QtXml>
#include <QDomDocument>

#include <QIODevice>
#include <QMessageBox>
//#include <QtCore5Compat/QTextCodec>

#include <string>
#include <map>

class OperateXML
{
public:

    explicit OperateXML(/*std::string filename = std::string("")*/);
    ~OperateXML();

    // 创建一个xml文件
    bool CreateXmlFile(std::string filename = std::string(""), QIODevice::OpenMode mode = QFileDevice::WriteOnly | QFileDevice::Truncate);

    // 添加一个信息头
    void CreateXmlHeader(std::string type = std::string("xml"), std::string version = "1.0", std::string encoding = std::string("UTF-8"));

    // 加载已有的xml文件
    bool LoadXml(std::string filename, QIODevice::OpenMode mode = QFileDevice::ReadOnly);

    // 获取根节点 Stu
    QDomElement GetRootNode();

    // 创建一个根节点  Stu
    QDomElement CreateXmlRootNode(std::string rootName = std::string("root"));

    // 添加一个没有属性的节点  <StuInfo/>  Stu StuInfo
    QDomElement AddNoAttributesNode(QDomElement fNode, std::string nodeName);

    // 添加一个有属性的节点  <StuInfo ID = "1">  Stu StuInfo  ID 1  Name 张三
    QDomElement AddAttributesNode(QDomElement fNode, std::string nodeName,
                                  std::list<std::pair<std::string, std::string>> Attribute);

    // 添加元素节点
    QDomElement  AddElementNode(QDomElement fNode, std::string nodeName, std::string value);

    // 设置节点属性
    QDomElement SetNodeAttribute(QDomElement node, std::string name, std::string value);

    // 删除节点 删除当前节点下的所有名为nodename的节点
    void DeleteNodes(QDomElement fNode, std::string nodename);

    // 删除节点 删除当前节点下的所有名为nodename的节点 且属性值相同
    void DeleteNode(QDomElement fNode, std::string nodename,
                    std::list<std::pair<std::string, std::string>> attribute);

    // 删除节点 删除所有节点下名为nodename的节点
    void DeleteNodes(std::string nodename);

     // 删除节点 删除所有节点下名为nodename的节点 且属性值相同
    void DeleteNode(std::string nodename, std::list<std::pair<std::string, std::string>> attribute);

    // 保存Xml  进位空格数
    void SaveXml(int retract = 4);

    // 获取当前节点以及同级下的兄弟节点 且名为name的节点  如果为第一个孩子节点记得传入第三个参数为true
    QDomElement GetElem(QDomElement& node, std::string name, bool first = false);
    QDomElement GetElem(QDomElement& node, QString name, bool first = false);


    // 获取当前节点以及同级下的兄弟节点 且名为name的节点的值
    std::string GetElemValue(QDomElement& node, std::string name, bool first = false);
    QString GetElemValue(QDomElement& node, QString name, bool first = false);


    // 获取 该节点指定的 属性节点值
    std::string GetElemAttributeValue(QDomElement node, std::string key);
    QString GetElemAttributeValue(QDomElement node, QString key);
private:
    QDomDocument* m_Doc;
    QFile* m_File;
    std::string m_FileName;

};

#endif // OPERATEXML_H 

OperateXML.cpp

#include "OperateXML.h"

OperateXML::OperateXML(/*std::string filename*/)
    : m_Doc(new QDomDocument())
    , m_File{nullptr}
{
}

OperateXML::~OperateXML()
{
    if(nullptr != m_Doc)
    {
        delete m_Doc;
        m_Doc = nullptr;
    }
    if(nullptr != m_File)
    {
        m_File->close();
        delete m_File;
        m_File = nullptr;
    }
}

bool OperateXML::CreateXmlFile(std::string filename, QIODevice::OpenMode mode)
{
    if(true == filename.empty())
    {
        QMessageBox::information(NULL, u8"提示", u8"文件名为空!");
        return false;
    }

    if(nullptr != m_File)
    {
        delete m_File;
        m_File = nullptr;
    }

    m_File = new QFile(QString::fromStdString(filename));

    if(false == m_File->open(mode))
    {
        QMessageBox::information(NULL, u8"提示", u8"文件打开或创建失败!");
        return false;
    }

    if(false == m_File->isOpen())
    {
        QMessageBox::information(NULL, u8"提示", u8"文件打开或创建失败!");
        return false;
    }

    return true;
}

void OperateXML::CreateXmlHeader(std::string type, std::string version, std::string encoding)
{
    // 创建XML处理类,通常用于处理第一行描述信息
    QDomProcessingInstruction instruction;

    std::string note =  std::string("version=\"") + version + std::string("\"  ") +
            std::string("encoding=\"") + encoding + std::string("\"");

    // 创建XML头部格式
    instruction = m_Doc->createProcessingInstruction(QString::fromStdString(type), QString::fromStdString(note));

    // 添加到XML文件中
    m_Doc->appendChild(instruction);
}

bool OperateXML::LoadXml(std::string filename, QIODevice::OpenMode mode)
{
    // 打开文件
    m_File = new QFile(QString::fromStdString(filename));

    if (false == m_File->open(mode))
    {
        QMessageBox::information(NULL, u8"提示", u8"文件打开失败!");

        return false;
    }

    // 将doc与file关联起来
    // 这个函数从IO设备dev中读取XML文档,如果内容被成功解析,则返回true;否则返回false。
    if (false == m_Doc->setContent(m_File))
    {
        QMessageBox::information(NULL, u8"提示", u8"操作的文件不是XML文件!");
        m_File->close();
        return false;
    }

    return true;
}

QDomElement OperateXML::GetRootNode()
{
    QDomElement root = m_Doc->documentElement();

    return root;
}

QDomElement OperateXML::CreateXmlRootNode(std::string rootName)
{
    // 创建根节点
    QDomElement rootNode = m_Doc->createElement(QString::fromStdString(rootName));

    // 添加到XML文件中
    m_Doc->appendChild(rootNode);


    return rootNode;
}

QDomElement OperateXML::AddNoAttributesNode(QDomElement fNode, std::string nodeName)
{
    if(true == fNode.isNull())
    {
        return QDomElement();
    }
    QDomElement node = m_Doc->createElement(QString::fromStdString(nodeName));

    fNode.appendChild(node);



    return node;
}

QDomElement OperateXML::AddAttributesNode(QDomElement fNode, std::string nodeName,
                                          std::list<std::pair<std::string, std::string>> Attribute)
{
    QDomElement node = m_Doc->createElement(QString::fromStdString(nodeName));

    // 给节点创建属性
    for(const auto& elem : Attribute)
    {
        // 参数一是字符串,参数二可以是任何类型
        node.setAttribute(QString::fromStdString(elem.first), QString::fromStdString(elem.second));
    }

    fNode.appendChild(node);

    return node;
}

QDomElement OperateXML::AddElementNode(QDomElement fNode, std::string nodeName, std::string value)
{
    // 创建子元素
    QDomElement node = m_Doc->createElement(QString::fromStdString(nodeName));

    // 设置尖括号中的值
    QDomText text = m_Doc->createTextNode(QString::fromStdString(value));

    // 添加关系
    node.appendChild(text);
    fNode.appendChild(node);

    return node;
}

QDomElement OperateXML::SetNodeAttribute(QDomElement node, std::string name, std::string value)
{
    QDomElement elemNode = m_Doc->createElement(QString::fromStdString(name));

    elemNode.setAttribute(QString::fromStdString(name), QString::fromStdString(value));

    node.appendChild(elemNode);

    return node;
}

void OperateXML::DeleteNodes(QDomElement fNode, std::string nodename)
{
    // 获取节点名字为Book的所有节点
    QDomNodeList nodes = m_Doc->elementsByTagName(QString::fromStdString(nodename));

    for (int i = nodes.size() - 1; i >= 0; i--)
    {
        // 获取节点
        QDomElement element = nodes.at(i).toElement();
        /*
         * Removes oldChild from the list of children. oldChild must be a direct child of this node.
            Returns a new reference to oldChild on success or a null node on failure.

            所以 要么从后向前删除 要么就需要重新指定新节点的位置
         */
        fNode.removeChild(element);
    }

}

void OperateXML::DeleteNode(QDomElement fNode, std::string nodename, std::list<std::pair<std::string, std::string>> attribute)
{
    QDomNodeList nodes = m_Doc->elementsByTagName(QString::fromStdString(nodename));

    for (int i = 0; i < nodes.count(); i++)
    {
        // 获取节点
        QDomElement element = nodes.at(i).toElement();

        bool isFind {true};
        for(const auto& elem : attribute)
        {
            // 进行判断(返回属性的值进行判断)
            if (element.attribute(QString::fromStdString(elem.first)) != QString::fromStdString(elem.second))
            {
                isFind = false;
            }
        }
        if(true == isFind)
        {
            fNode.removeChild(nodes.at(i));
        }
    }
}

void OperateXML::DeleteNodes(std::string nodename)
{
    // 获取节点名字为Book的所有节点
    QDomNodeList nodes = m_Doc->elementsByTagName(QString::fromStdString(nodename));

    // QDomElement root = GetRootNode();

    for (int i = nodes.size() - 1; i >= 0; i--)
    {
        // 获取节点
        QDomElement element = nodes.at(i).toElement();
        /*
         * Removes oldChild from the list of children. oldChild must be a direct child of this node.
            Returns a new reference to oldChild on success or a null node on failure.

            所以 要么从后向前删除 要么就需要重新指定新节点的位置
         */
        QDomNode fNode = element.parentNode();
        fNode.removeChild(element);
    }
}

void OperateXML::DeleteNode(std::string nodename, std::list<std::pair<std::string, std::string> > attribute)
{
    QDomNodeList nodes = m_Doc->elementsByTagName(QString::fromStdString(nodename));

    for (int i = 0; i < nodes.count(); i++)
    {
        // 获取节点
        QDomElement element = nodes.at(i).toElement();

        bool isFind {true};
        for(const auto& elem : attribute)
        {
            // 进行判断(返回属性的值进行判断)
            if (element.attribute(QString::fromStdString(elem.first)) != QString::fromStdString(elem.second))
            {
                isFind = false;
            }
        }
        if(true == isFind)
        {
            QDomNode fNode = element.parentNode();
            fNode.removeChild(nodes.at(i));
        }
    }
}

void OperateXML::SaveXml(int retract)
{
    m_File->close();
    if (false == m_File->open(QFileDevice::WriteOnly | QFileDevice::Truncate))
    {
        QMessageBox::information(NULL, "提示", "文件打开失败!");
        return;
    }
    QTextStream stream(m_File);
    m_Doc->save(stream, retract);
}

QDomElement OperateXML::GetElem(QDomElement& node, std::string name, bool first)
{
    if(true == first)
    {
        node = node.firstChild().toElement();
    }
    while(false == node.isNull())
    {
        if (node.toElement().tagName() == QString::fromStdString(name))
        {
            return node;
        }
        node = node.nextSibling().toElement();
    }
    return QDomElement();
}

QDomElement OperateXML::GetElem(QDomElement &node, QString name, bool first)
{
    if(true == first)
    {
        node = node.firstChild().toElement();
    }
    while(false == node.isNull())
    {
        // qDebug() << node.toElement().tagName();
        if (node.toElement().tagName() == name)
        {
            return node;
        }
        node = node.nextSibling().toElement();
    }
    return QDomElement();
}

std::string OperateXML::GetElemValue(QDomElement& node, std::string name, bool first)
{
    if(true == first)
    {
        node = node.firstChild().toElement();
    }
    while(false == node.isNull())
    {
        // qDebug() << node.toElement().tagName();
        if (node.toElement().tagName() == QString::fromStdString(name))
        {
            return node.toElement().text().toStdString();
        }
        node = node.nextSibling().toElement();
    }
    return std::string();
}

QString OperateXML::GetElemValue(QDomElement &node, QString name, bool first)
{
    if(true == first)
    {
        node = node.firstChild().toElement();
    }
    while(false == node.isNull())
    {
        // qDebug() << node.toElement().tagName();
        if (node.toElement().tagName() == name)
        {
            return node.toElement().text();
        }
        node = node.nextSibling().toElement();
    }
    return QString();
}
std::string OperateXML::GetElemAttributeValue(QDomElement node, std::string key)
{
    std::string value;

    if (false == node.isNull() && true == node.toElement().hasAttribute(QString::fromStdString(key)))
    {
        value = node.toElement().attributeNode(QString::fromStdString(key)).value().toStdString();
    }
    return value;
}

QString OperateXML::GetElemAttributeValue(QDomElement node, QString key)
{
    QString value;

    if (false == node.isNull() && true == node.toElement().hasAttribute(key))
    {
        value = node.toElement().attributeNode(key).value();
    }
    return value;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Qt中提供了QDomDocument用于操作XML文档,同时也提供了QTableWidget和QTableView用于显示数据。我们可以利用这些来实现读取XML文件并进行降序排列等操作。 首先,我们需要使用QDomDocument加载XML文件。例如,可以通过以下代码读取名为"example.xml"的XML文件: ```cpp QDomDocument doc; QFile file("example.xml"); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Failed to open XML file"; return; } if (!doc.setContent(&file)) { qDebug() << "Failed to load XML file"; file.close(); return; } file.close(); ``` 接下来,我们可以使用QDomDocument的方法获取XML文件中的节点数据,并将其填充到QTableWidget或QTableView中进行显示。例如,可以使用以下代码读取XML文件中的所有"item"节点的内容,并将其添加到QTableWidget中: ```cpp QDomNodeList itemList = doc.elementsByTagName("item"); int rowCount = itemList.count(); QTableWidget *tableWidget = new QTableWidget(rowCount, 2); // 创建2列的表格 for (int i = 0; i < rowCount; i++) { QDomElement itemElem = itemList.at(i).toElement(); QString name = itemElem.attribute("name"); QString value = itemElem.text(); tableWidget->setItem(i, 0, new QTableWidgetItem(name)); tableWidget->setItem(i, 1, new QTableWidgetItem(value)); } ``` 如果要对表格数据进行排序,可以使用QTableWidget或QTableView的排序功能。例如,可以使用以下代码对表格数据按第一列进行降序排列: ```cpp tableWidget->setSortingEnabled(true); // 开启排序功能 tableWidget->sortByColumn(0, Qt::DescendingOrder); // 按第一列降序排列 ``` 总结来说,要使用Qt中的TableWidget或TableView读取XML文件并进行降序排列等操作,首先需要加载XML文件,然后将节点数据填充到表格中,并通过表格的排序功能实现排列操作。 ### 回答2: Qt提供了读取XML文件的模块QtXml。可以通过QDomDocument来解析XML文件,然后可以使用QDomElement、QDomNode、QDomNodeList等来获取XML文件中的元素和节点。 要使用QTableWidget或QTableView来显示XML文件中的数据,首先需要创建一个table widget或table view对象,并设置好表格的列数。然后,可以通过遍历XML文件中的内容,将每个元素和节点的值添加到相应的表格单元格中。 对于降序排列,可以使用QTableWidget或QTableView的sortItems()方法来实现。可以指定要按照哪一列进行排序,以及是升序还是降序。可以通过设置QTableWidgetItem的setData()方法来设置每个单元格的数据,然后使用setItem()方法将其添加到表格中的相应位置。 实现以上功能的大致步骤如下: 1. 创建一个空的QDomDocument对象,并使用load()方法加载XML文件。 2. 获取XML文件的根节点,并使用childNodes()获取子节点列表。 3. 遍历子节点列表,并将每个节点的元素值添加到QTableWidget或QTableView的单元格中。 4. 对QTableWidget或QTableView进行降序排列,可以使用sortItems()方法。 5. 将QTableWidget或QTableView显示在界面上。 通过这样的方法,可以读取XML文件并在表格中显示数据,同时可以对表格中的数据进行排序等操作。具体实现的细节可以根据实际需求进行调整。 ### 回答3: Qt提供了QTableWidget和QTableView两个读取和显示xml文件。首先,你需要通过QDomDocument来解析xml文件。然后,你可以使用QDomNode和QDomElement来遍历xml文件的节点和元素。接下来,你可以将解析得到的数据填充到QTableWidget或QTableView中。 要按降序排列,可以使用QTableWidget或QTableView的sortItems()函数来实现。你需要指定要排序的列和排序的顺序(升序或降序)。 下面是一个示例代码,展示了如何使用QTableWidget和QDomDocument来读取xml文件并按降序排列: ```cpp #include <QtWidgets> #include <QtXml> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建QTableWidget QTableWidget tableWidget; // 加载xml文件 QDomDocument doc; QFile file("data.xml"); if (!file.open(QIODevice::ReadOnly) || !doc.setContent(&file)) { qDebug() << "Error opening file or loading XML"; return -1; } file.close(); // 获取根节点 QDomElement root = doc.documentElement(); // 获取子节点 QDomNodeList nodes = root.elementsByTagName("item"); // 设置表格行列数 tableWidget.setRowCount(nodes.count()); tableWidget.setColumnCount(2); // 假设有两列 for (int i = 0; i < nodes.count(); ++i) { QDomElement element = nodes.at(i).toElement(); // 获取xml数据并填充到表格中 QTableWidgetItem *item1 = new QTableWidgetItem(element.attribute("name")); QTableWidgetItem *item2 = new QTableWidgetItem(element.attribute("value")); tableWidget.setItem(i, 0, item1); tableWidget.setItem(i, 1, item2); } // 按第二列降序排列 tableWidget.sortItems(1, Qt::DescendingOrder); // 显示表格 tableWidget.show(); return app.exec(); } ``` 以上代码使用QTableWidget读取一个名为"data.xml"的xml文件并在表格中显示。代码中使用QDomDocument来解析xml文件,通过QDomNode和QDomElement来遍历节点和元素,并将解析得到的数据填充到表格中。最后,使用sortItems()函数按表格的第二列进行降序排列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林夕07

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值