xercesc库保存XML功能实现

目录

一 参考链接

二  运行结果

三 代码


一 参考链接

DOM Programming Guide (apache.org)

Xerces-c DOM XML文件的构造_xerces-c domimplementation-CSDN博客

Xerces-c库的使用-CSDN博客

二  运行结果

三 代码


#if 1


//参考链接: https://blog.csdn.net/RGBMarco/article/details/81300814
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/dom/DOM.hpp>

#include <xercesc/framework/LocalFileFormatTarget.hpp>

#include <xercesc/dom/DOMImplementationRegistry.hpp>
#include <xercesc/dom/DOMImplementationLS.hpp>
#include <xercesc/dom/DOMLSSerializer.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XMLString.hpp>

#include <xercesc/dom/DOMLSSerializerFilter.hpp>

#include <xercesc/dom/DOMError.hpp>
#include <xercesc/dom/DOMErrorHandler.hpp>

#include <xercesc/framework/XMLFormatter.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XMLString.hpp>

#include <fstream>
#include <iostream>

#define Transcode_1(x)  XMLString::transcode(x)
#define Transcode_3(x,y,z) XMLString::transcode(x,y,z)

using namespace xercesc;

class MyDOMLSSerializerFilter : public xercesc::DOMLSSerializerFilter {
public:
    // Constructor
    MyDOMLSSerializerFilter() {}

    // Destructor
    virtual ~MyDOMLSSerializerFilter() {}

    // 实现所有纯虚函数
        /**
     * Tells the DOMLSSerializer what types of nodes to show to the filter.
     * See <code>DOMNodeFilter</code> for definition of the constants.
     * The constant SHOW_ATTRIBUTE is meaningless here, attribute nodes will
     * never be passed to a DOMLSSerializerFilter.
     *
     * @return The constants of what types of nodes to show.
     * @since DOM Level 3
     */
    ShowType getWhatToShow() const {
        return 0;
    };

    // -----------------------------------------------------------------------
    //  Virtual DOMLSSerializerFilter interface
    // -----------------------------------------------------------------------
    /** @name Functions introduced in DOM Level 3 */
    //@{
     /**
     * Interface from <code>DOMNodeFilter</code>,
     * to be implemented by implementation (derived class)
     */
    FilterAction acceptNode(const DOMNode* node) const {
        std::cout << "acceptNode: " << std::endl;
        return FilterAction::FILTER_ACCEPT;
    };
};


class MyDOMErrorHandler : public xercesc::DOMErrorHandler {
public:
    // Constructor
    MyDOMErrorHandler() {}

    // Destructor
    virtual ~MyDOMErrorHandler() {}

    // Handles a warning received from the parser
    bool handleWarning(const xercesc::DOMError& domError) {
        // Here you can implement your own logic to handle warnings
        // For now, we just print the message and return true
        std::cout << "Warning: " << xercesc::XMLString::transcode(domError.getMessage()) << std::endl;
        return true;
    }

    // Handles an error received from the parser
    bool handleError(const xercesc::DOMError& domError) {
        // Here you can implement your own logic to handle errors
        // For now, we just print the message and return false
        std::cout << "Error: " << xercesc::XMLString::transcode(domError.getMessage()) << std::endl;
        return false;
    }

    // Handles a fatal error received from the parser
    bool handleFatalError(const xercesc::DOMError& domError) {
        // Here you can implement your own logic to handle fatal errors
        // For now, we just print the message and return false
        std::cout << "Fatal Error: " << xercesc::XMLString::transcode(domError.getMessage()) << std::endl;
        return false;
    }

    // Resets the error handler
    void resetErrors() {
        // Here you can implement your own logic to reset errors if needed
    }
};



class StdOutFormatTarget : public xercesc::XMLFormatTarget {
public:

    // -----------------------------------------------------------------------
    //  Virtual interface
    // -----------------------------------------------------------------------
    void writeChars(
        const XMLByte* const      toWrite
        , const XMLSize_t           count
        , XMLFormatter* const formatter) {};

    void flush() {};
};


int main()
{
    try
    {
        //XMLPlatformUtils::Initialize();//en_US
        XMLPlatformUtils::Initialize("zh_CN");
    }
    catch (const XMLException& toCatch)
    {
        std::cerr << Transcode_1(toCatch.getMessage());
    }
    try
    {
        DOMImplementation* imp = DOMImplementationRegistry::getDOMImplementation(Transcode_1("Core"));
        DOMDocument* doc = imp->createDocument(0, Transcode_1("root"), 0);

        DOMElement* node = doc->createElement(Transcode_1("node1"));
        node->setAttribute(Transcode_1("name"), Transcode_1("node1"));
        node->setTextContent(Transcode_1("中文名字node1"));

        DOMElement* root = doc->getDocumentElement();
        root->appendChild(node);

        DOMElement* node2 = doc->createElement(Transcode_1("node2"));
        node2->setAttribute(Transcode_1("name"), Transcode_1("node2"));
        node2->setTextContent(Transcode_1("node2"));

        root->appendChild(node2);

        DOMElement* node2_1 = doc->createElement(Transcode_1("node2_1"));
        node2_1->setAttribute(Transcode_1("name"), Transcode_1("node2_1"));
        node2_1->setTextContent(Transcode_1("node2_1"));
        node2->appendChild(node2_1);

        DOMElement* node2_2 = doc->createElement(Transcode_1("node2_2"));
        node2_2->setAttribute(Transcode_1("name"), Transcode_1("node2_2"));
        node2_2->setTextContent(Transcode_1("node2_2"));
        node2->appendChild(node2_2);

        DOMLSOutput* output = dynamic_cast<DOMImplementationLS*>(imp)->createLSOutput();

        DOMLSSerializer* serial = dynamic_cast<DOMImplementationLS*>(imp)->createLSSerializer();

        DOMLSSerializerFilter* filter = new MyDOMLSSerializerFilter();
        serial->setFilter(filter);

        // optionally you can implement your DOMErrorHandler (e.g. MyDOMErrorHandler)
        // and set it to the serializer
        DOMErrorHandler* errHandler = new MyDOMErrorHandler();
        serial->getDomConfig()->setParameter(XMLUni::fgDOMErrorHandler, errHandler);

        // StdOutFormatTarget prints the resultant XML stream
        // to stdout once it receives any thing from the serializer.
        XMLFormatTarget* myFormTarget = new StdOutFormatTarget();
        output->setByteStream(myFormTarget);

        LocalFileFormatTarget* target = new LocalFileFormatTarget("a中文.xml");

        output->setByteStream(target);
        serial->write(doc, output);
        doc->release();
        serial->release();
        delete target;
    }
    catch (const DOMException& toCatch)
    {
        std::cerr << Transcode_1(toCatch.getMessage());
    }
    return 0;
}

#endif


#if 0
//https://blog.csdn.net/RGBMarco/article/details/81253563

#include <iostream>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/sax/SAXException.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <string>
#include <vector>

using namespace std;
using namespace xercesc;

#define STUDENTS_TAG  "Students"
#define STUDENT_TAG   "Student"
#define NAME_TAG      "Name"
#define AGE_TAG       "Age"
#define SEX_TAG       "Sex"

struct Student {
    string  Name;
    int     Age;
    string  Sex;
};

enum ErrorCode
{
    LACK_BEGIN = 1,     // 缺少<Students>标记
    LACK_NAME = 2,     // 缺少姓名
    LACK_AGE = 3,     // 缺少年龄
    LACK_SEX = 4      // 缺少性别
};

DOMElement* findStudentsTag(DOMElement* root)
{
    if (root == 0)
        return 0;
    if (XMLString::compareString(XMLString::transcode(root->getTagName()), STUDENTS_TAG) == 0)
        return root;
    else
        return findStudentsTag(root->getNextElementSibling());
}

int visitDom2GetStudents(DOMElement* root, vector<Student>& students)
{
    DOMElement* stustag = findStudentsTag(root);
    if (stustag == 0)
        return LACK_BEGIN;
    DOMNodeList* stulist = root->getElementsByTagName(XMLString::transcode(STUDENT_TAG));
    size_t length = stulist->getLength();
    for (size_t index = 0; index < length; ++index)
    {
        DOMElement* elems = dynamic_cast<DOMElement*>(stulist->item(index));
        DOMElement* name = elems->getFirstElementChild();
        Student stu;
        if (name == 0)
            return LACK_NAME;
        if (XMLString::compareString(XMLString::transcode(name->getTagName()), NAME_TAG) == 0)
        {
            DOMNode* n = dynamic_cast<DOMNode*>(name);
            stu.Name = static_cast<string>(XMLString::transcode(n->getTextContent()));
        }
        else
            return LACK_NAME;

        DOMElement* age = name->getNextElementSibling();
        if (age == 0)
            return LACK_AGE;
        if (XMLString::compareString(XMLString::transcode(age->getTagName()), AGE_TAG) == 0)
        {
            DOMNode* n = dynamic_cast<DOMNode*>(age);
            stu.Age = atoi(XMLString::transcode(n->getTextContent()));
        }
        else
            return LACK_AGE;
        DOMElement* sex = age->getNextElementSibling();
        if (sex == 0)
        {
            return LACK_SEX;
        }
        if (XMLString::compareString(XMLString::transcode(sex->getTagName()), SEX_TAG) == 0)
        {
            DOMNode* n = dynamic_cast<DOMNode*>(sex);
            stu.Sex = static_cast<string>(XMLString::transcode(n->getTextContent()));
        }
        else
            return LACK_SEX;
        students.emplace_back(stu);
    }
    return 0;
}

int main()
{
    try
    {
        XMLPlatformUtils::Initialize();
    }
    catch (const XMLException& toCatch)
    {
        std::cerr << XMLString::transcode(toCatch.getMessage());
        return -1;
    }

    XercesDOMParser* parser = new XercesDOMParser();
    ErrorHandler* errHandler = new HandlerBase();
    parser->setErrorHandler(errHandler);
    try
    {
        parser->parse("test.xml");
    }
    catch (const XMLException& toCatch)
    {
        std::cerr << XMLString::transcode(toCatch.getMessage());
        return -1;
    }
    catch (const DOMException& toCatch)
    {
        std::cerr << XMLString::transcode(toCatch.getMessage());
        return -1;
    }
    catch (const SAXException& toCatch)
    {
        std::cerr << XMLString::transcode(toCatch.getMessage());
        return -1;
    }

    DOMDocument* doc = parser->getDocument();
    DOMElement* root = doc->getDocumentElement();
    vector<Student> students;
    int ret = visitDom2GetStudents(root, students);
    if (ret != 0)
        std::cerr << "Parse error\n";
    else
    {
        for (auto stu : students)
        {
            std::cout << "Name: " << stu.Name << "\n"
                << " Age: " << stu.Age << "\n"
                << " Sex: " << stu.Sex << "\n";
        }
    }
    doc->release();
    XMLPlatformUtils::Terminate();
    return 0;
}
#endif

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

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

相关文章

HarmonyOS NEXT应用开发之SideBarContainer侧边栏淡入淡出动效实现案例

介绍 在2in1或平板上&#xff0c;群聊侧边栏是一种较为常用的功能&#xff0c;虽然HarmonyOS已经具备了基本的动效&#xff0c;但是部分情况下开发者可能有定制侧边栏动效的需求&#xff0c;本例主要介绍了如何基于显式动画实现侧边栏的淡入淡出动效。 效果图预览 使用说明&a…

【区间、栈】算法例题

目录 六、区间 48. 汇总区间 ① 49. 合并区间 ② 50. 插入区间 ② 51. 用最少数量的箭引爆气球 ② 七、栈 52. 有效的括号 ① 53. 简化路径 ② 54. 最小栈 ② 55. 逆波兰表达式求值 ② √- 56. 基本计算器 ③ 六、区间 48. 汇总区间 ① 给定一个 无重复元素 的 …

静态代理IP如何测试?

随着互联网的普及&#xff0c;越来越多的人开始使用动态IP进行上网。但是在某些情况下&#xff0c;我们可能需要使用静态IP进行测试或特定的网络设置。本文将介绍如何获取静态IP进行测试以及静态IP的优点。 一、如何获取静态IP进行测试&#xff1f; 1.联系ISP&#xff08;Int…

DM-达梦数据库实时主备搭建

dm实时主备说明 将主库产生的 Redo日志传输到备库&#xff0c;备库接收并重演Redo日志&#xff0c;从而实现备库与主库的数据同步。 一、环境准备 1.1、配置环境准备 首先搭建实时主备&#xff0c;要规划好机器的&#xff0c;我准备两台机器服务器 主服务器 mast…

7-5 表格输出

题目链接&#xff1a;7-5 表格输出 一. 题目 1. 题目 2. 输入输出格式 3. 限制 二、代码 实现一 1. 代码实现 #include <stdio.h>int main(void){printf("------------------------------------\n\ Province Area(km2) Pop.(10K)\n\ ------------------…

14|CAMEL:通过角色扮演脑暴一个鲜花营销方案

能否让 ChatGPT 自己生成这些引导文本呢&#xff1f; CAMEL 交流式代理框架 CAMEL 框架旨在通过角色扮演来促进交流代理之间的自主合作&#xff0c;并为其“认知”过程提供洞察。这种方法涉及使用启示式提示来指导聊天代理完成任务&#xff0c;同时保持与人类意图的一致性。…

【virtio-networking 和 vhost-net 简介】

文章目录 Virtio 基本构建块Virtio spec 和 vhost 协议Vhost-net/virtio-net architectureVirtio-networking and OVS总结参考链接 Virtio 是作为虚拟机 (VM)访问简化device&#xff08;如块设备和网络适配器&#xff09;的 标准化开放接口而开发的。Virtio-net是一种虚拟以太…

大众EA111发动机

大众EA111发动机_什么是大众EA111发动机_太平洋汽车百科 大众EA111发动机_什么是大众EA111发动机_太平洋汽车百科 大众的EA111系列发动机是大众公司小排量发动机的主力&#xff0c;有1.2L、1.4L、1.6L三种排量。大众的EA111系列发动机融合了缸内直喷、涡轮增压等先进技术&…

鸿蒙Harmony应用开发—ArkTS-转场动画(页面间转场)

当路由进行切换时&#xff0c;可以通过在pageTransition函数中自定义页面入场和页面退场的转场动效。详细指导请参考页面转场动画。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 为了实现更好的转场效…

稀碎从零算法笔记Day22-LeetCode:存在重复元素 II

题型&#xff1a;哈希表、数组 链接&#xff1a;219. 存在重复元素 II - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] …

使用vitepress生成文档博客简单demo

先创建个空目录(就是你的项目) 安装vitepress 就是在你刚创建的目录里安装vitepress&#xff1a; npm add -D vitepress初始化项目 还是在你刚操作的目录里执行&#xff1a; npx vitepress init然后按照命令行的指引一步一步走就好了 注意VitePress的项目位置&#xff0c…

外卖项目:实现用户端微信登录(debug)

文章目录 一、业务描述二、接口设计三、表结构设计四、配置文件五、断点调试 一、业务描述 用户进入到小程序的时候&#xff0c;微信授权登录之后才能点餐。需要获取当前微信用户的相关信息&#xff0c;比如昵称、头像等&#xff0c;这样才能够进入到小程序进行下单操作。是基…

SpringBoot如何写好单元测试

&#x1f413;序言 Spring中的单元测试非常方便&#xff0c;可以很方便地对Spring Bean进行测试&#xff0c;包括Controller、Service和Repository等Spring Bean进行测试&#xff0c;确保它们的功能正常&#xff0c;并且不会因为应用的其他变化而出现问题。 &#x1f413;单元测…

完全理解ARM启动流程:Uboot-Kernel

内容共计5W字数&#xff0c;但是我还是很多地方说的不够尽兴。那么下次聊&#xff01; 前言 bootloader是系统上电后最初加载运行的代码。它提供了处理器上电复位后最开始需要执行的初始化代码。 PC机上引导程序一般由BIOS开始执行&#xff0c;然后读取硬盘中位于MBR(Main Bo…

Vue核心知识点 -Vue2响应式系统是基于什么实现的、以及会产生什么问题和解决方案

一、概念 在Vue 2中&#xff0c;响应式系统是基于Object.defineProperty实现的。它通过劫持对象的属性来实现数据的响应式更新。 当你将一个对象传递给Vue实例的data选项时&#xff0c;Vue会遍历对象的每个属性&#xff0c;并使用Object.defineProperty方法将其转换为getter和s…

YOLO_you only look once

前言 计算机图形学的课程即将结束&#xff0c;我需要提交一份关于YOLO模型的学习报告。在这段时间里&#xff0c;我对YOLO进行了深入的学习和研究&#xff0c;并记录下了我的学习过程和心得体会。本文将详细介绍YOLO模型的原理、优缺点以及应用领域&#xff0c;希望能够为后续…

nodejs pkg打包跨平台执行文件,带.node插件(sharp、sqlite3)

在nodejs引入的第三方库中,大部分插件都是nodejs原生开发,使用pkg可以快速打包,生成windows、linux(ubuntu、centOS等)、麒麟系统下面执行文件。遇到了第三方插件gdal、sharp、sqlite3,在webstorm中打包生成执行文件,跨平台部署的时候会出现找不到###.node文件,需要获取部…

多源BFS - 01矩阵

LCR 107. 01 矩阵 到最近的0的距离&#xff0c;对每一个非0的位置进行搜索&#xff0c;找到最短的距离即可&#xff0c;但如果对每一个非0的点都进行一次搜索的话&#xff0c;肯定是会超时的。这里可以考虑&#xff0c;将所有0点想象成一个0点(超级0)。然后找到所有1点到超级0的…

基于ssm的旅游管理系统

技术&#xff1a;ssmmysqljsp 一、背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&#xff0c;尤其是规模较大…

Nginx鉴权、限流

文章目录 一、Nginx鉴权1. 依赖模块2. Nginx配置3. Rest接口 二、Nginx限流1. 简介2. 控制速率2. 控制连接数 一、Nginx鉴权 1. 依赖模块 依赖模块 http_auth_request_module验证是否安装 nginx -V 2>&1 | grep -- http_auth_request_module2. Nginx配置 server {li…