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:// ConstructorMyDOMLSSerializerFilter() {}// Destructorvirtual ~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:// ConstructorMyDOMErrorHandler() {}// Destructorvirtual ~MyDOMErrorHandler() {}// Handles a warning received from the parserbool handleWarning(const xercesc::DOMError& domError) {// Here you can implement your own logic to handle warnings// For now, we just print the message and return truestd::cout << "Warning: " << xercesc::XMLString::transcode(domError.getMessage()) << std::endl;return true;}// Handles an error received from the parserbool handleError(const xercesc::DOMError& domError) {// Here you can implement your own logic to handle errors// For now, we just print the message and return falsestd::cout << "Error: " << xercesc::XMLString::transcode(domError.getMessage()) << std::endl;return false;}// Handles a fatal error received from the parserbool 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 falsestd::cout << "Fatal Error: " << xercesc::XMLString::transcode(domError.getMessage()) << std::endl;return false;}// Resets the error handlervoid 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_USXMLPlatformUtils::Initialize("zh_CN");}catch (const XMLException& toCatch){std::cerr << Transcode_1(toCatch.getMessage());}try{//DOMImplementation* imp = DOMImplementationRegistry::getDOMImplementation(Transcode_1("Core"));DOMImplementation* imp = DOMImplementationRegistry::getDOMImplementation(L"LS");DOMLSOutput* output = dynamic_cast<DOMImplementationLS*>(imp)->createLSOutput();DOMLSSerializer* serial = dynamic_cast<DOMImplementationLS*>(imp)->createLSSerializer();output->setEncoding(L"UTF-8");DOMLSSerializerFilter* filter = new MyDOMLSSerializerFilter();serial->setFilter(filter);// optionally you can implement your DOMErrorHandler (e.g. MyDOMErrorHandler)// and set it to the serializerDOMErrorHandler* 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();const wchar_t* str = L"a中文.xml";XMLFormatTarget* target = new LocalFileFormatTarget(str);output->setByteStream(target);// set user specified end of line sequence and output encodingserial->setNewLine(L"\r");// set serializer features serial->getDomConfig()->setParameter(XERCES_CPP_NAMESPACE_QUALIFIER XMLUni::fgDOMWRTSplitCdataSections, false);serial->getDomConfig()->setParameter(XERCES_CPP_NAMESPACE_QUALIFIER XMLUni::fgDOMWRTSplitCdataSections, false);serial->getDomConfig()->setParameter(XERCES_CPP_NAMESPACE_QUALIFIER XMLUni::fgDOMWRTDiscardDefaultContent, false);serial->getDomConfig()->setParameter(XERCES_CPP_NAMESPACE_QUALIFIER XMLUni::fgDOMWRTFormatPrettyPrint, true);//换行serial->getDomConfig()->setParameter(XERCES_CPP_NAMESPACE_QUALIFIER XMLUni::fgDOMWRTBOM, false);DOMDocument* doc = imp->createDocument(0, Transcode_1("root"), 0);const wchar_t* strNode1 = L"node1中文";DOMElement* node = doc->createElement(L"node1");node->setAttribute(Transcode_1("name"), L"node1");node->setTextContent(strNode1);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);if (doc){doc->setXmlStandalone(true);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;elsereturn 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()));}elsereturn 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()));}elsereturn 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()));}elsereturn 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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE3.0(一):vue3.0简介

Vue 3 入门指南 什么是vue Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界…

租用阿里云2核2G服务器配置报价,61元和99元

阿里云2核2G服务器配置优惠价格61元和99元&#xff0c;61元是轻量应用服务器2核2G3M带宽、50G高效云盘&#xff0c;99元服务器是ECS云服务器经济型e实例2核2G、3M固定带宽、40G ESSD entry 系统盘。活动 aliyunfuwuqi.com/go/aliyun 阿里云服务器网aliyunfuwuqi.com根据上面的官…

如何减少pdf的文件大小?pdf压缩工具介绍

文件发不出去&#xff0c;有时就会耽误工作进度&#xff0c;文件太大无法发送&#xff0c;这应该是大家在发送PDF时&#xff0c;常常会碰到的问题吧&#xff0c;那么PDF文档压缩大小怎么做呢&#xff1f;因此我们需要对pdf压缩后再发送&#xff0c;那么有没有好用的pdf压缩工具…

1、goreplay流量回放

目的 在实际项目中&#xff0c;会有大量的回归测试工作&#xff0c;通常会使用自动化代码的手段来实现回归&#xff0c;但是对于一个庞大的系统来说&#xff0c;通过自动化脚本的方式来实现回归测试&#xff0c;又显得很费时费力。并且如果有定期将线上数据同步到测试环境的需求…

制作一个RISC-V的操作系统六-bootstrap program(risv 引导程序)

文章目录 硬件基本概念qemu-virt地址映射系统引导CSR![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/86461c434e7f4b1b982afba7fad0256c.png)machine模式下的csr对应的csr指令csrrwcsrrs mhartid引导程序做的事情判断当前hart是不是第一个hart初始化栈跳转到c语言的…

uni-app打包证书android

Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。 Android证书的生成是自助和免费的&#xff0c;不需要审批或付费。 可以使用JRE环境中的keytool命令生成。 以下是windows平台生成证…

YOLOv5全网首发改进: 注意力机制改进 | 上下文锚点注意力(CAA) | CVPR2024 PKINet 遥感图像目标检测

💡💡💡本文独家改进:引入了CAA模块来捕捉长距离的上下文信息,利用全局平均池化和1D条形卷积来增强中心区域的特征,从而提升检测精度,CAA和C3进行结合实现二次创新,改进思路来自CVPR2024 PKINet,2024年前沿最新改进,抢先使用 💡💡💡小目标数据集,涨点近两个…

云原生相关知识

一、kubernetes 1 概述 Kubernetes&#xff08;也称 k8s 或 “kube”&#xff09;是一 个​​开源​​的容器编排平台&#xff0c;可以自动完成在部署、管理和扩展容器化应用过程中涉及的许多手动操作。 我们常说的编排的英文单词为 “Orchestration”&#xff0c;它常被解释…

Git 分布式版本控制系统基本概念和操作命令

目录 Git 基本概念 功能特点 工作流程 操作命令 新建代码库 配置 增删文件 代码提交 分支 标签 查看信息 远程同步 撤销 其他 小结 Git Git 是一个开源的分布式版本控制系统&#xff0c;用于跟踪文件的变更历史。它最初由 Linux Torvalds 设计&#xff0c;用于…

结构体内存对齐 offsetof 枚举 联合体

文章目录 结构体结构体内存对齐结构体嵌套结构体内存对齐的原因修改默认对齐数设置默认对齐数 #pragma pack() offsetof() 是宏 offset偏移量 of是谁的偏移量。计算结构体成员相对于结构体的起始位置偏移量是几。 结构体传参值传递地址传递 位段枚举联合 联合体 共用体联合体大…

4 种策略让 MySQL 和 Redis 数据保持一致

先阐明一下 MySQL 和 Redis 的关系&#xff1a;MySQL 是数据库&#xff0c;用来持久化数据&#xff0c;一定程度上保证数据的可靠性&#xff1b;Redis 是用来当缓存&#xff0c;用来提升数据访问的性能。 关于如何保证 MySQL 和 Redis 中的数据一致&#xff08;即缓存一致性问题…

Windows下安装QT,遇到下载组件中没有指定版本(提供解决方式) + 5.15详细安装步骤版

Windows下安装QT 5.15详细安装问题详解 前情提要一、QT 5.15及之后版本的下载问题二、QT 5.15及之后版本的下载方式&#xff1a;下载QT(在线安装版本)三、详细安装步骤遇到<下载组件>中没有指定版本的解决方式 前情提要 嵌入式设备搭载的QT版本是5.15&#xff0c;所以PC…

C语言技能数(知识点汇总)

C语言技能数&#xff08;知识点汇总&#xff09; C 语言概述特点不足之处 标准编程机制 数据类型变量数据类型字符类型整数类型符号位二进制的原码、反码和补码 浮点类型布尔类型 常量字面常量const 修饰的常变量#define定义的标识符常量枚举常量 sizeofsizeof(结构体)不要对 v…

【Godot4.2】 基于SurfaceTool的3D网格生成与体素网格探索

概述 说明&#xff1a;本文基础内容写于2023年6月&#xff0c;由三五篇文章汇总而成&#xff0c;因为当时写的比较潦草&#xff0c;过去时间也比较久了&#xff0c;我自己都得重新阅读和理解一番&#xff0c;才能知道自己说了什么&#xff0c;才有可能重新优化整理。 因为我对…

【计算机网络】常见面试题汇总

文章目录 1.计算机网络基础1.1网络分层模型/OSI七层模型是什么&#xff1f;1.2TCP/IP四层模型是什么&#xff1f;每一层的作用&#xff1f;1.2.1TCP四层模型&#xff1f;1.2.2为什么网络要分层&#xff1f; 1.2常见网络协议1.2.1应用层常见的协议1.2.2网络层常见的协议 2.HTTP2…

动态规划——斐波那契问题(Java)

目录 什么是动态规划&#xff1f; 练习 练习1&#xff1a;斐波那契数 练习2&#xff1a;三步问题 练习3&#xff1a;使用最小花费爬楼梯 练习4&#xff1a;解码方法 什么是动态规划&#xff1f; 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;&…

锂电池寿命预测 | Matlab基于ALO-SVR蚁狮优化支持向量回归的锂离子电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于ALO-SVR蚁狮优化支持向量回归的锂离子电池剩余寿命预测 基于蚁狮优化和支持向量回归的锂离子电池剩余寿命预测: 1、提取NASA数据集的电池容量&#xff0c;以历史容量作为输入&#xff0c;…

电脑安装双系统windows和ubuntu server

1.创建Ubuntu-server的启动盘 首先要从官网下载Ubuntu-server18.04的ISO文件&#xff0c;用rufs烧录到U盘。如下所示 2. 磁盘分区 在windows创建两个盘&#xff08;linuxboot 和linuxroot&#xff09;&#xff0c;后面一个一个用于boot&#xff0c;一个用于root. 3.开机U盘启…

AI开源概览及工具使用

一、前言 随着ChatGPT热度的攀升&#xff0c;越来越多的公司也相继推出了自己的AI大模型&#xff0c;如文心一言、通义千问等。各大应用也开始内置AI玩法&#xff0c;如抖音的AI特效&#xff1b; 关联资源&#xff1a;代码 GitHub、相关论文、项目Demo、产品文档、Grok Ai、gr…

【项目自我反思之vue的组件通信】

为什么子组件不能通过props实时接收父组件修改后动态变化的值 一、现象二、可能的原因1.响应式系统的限制2.异步更新队列3.父组件和子组件的生命周期4.子组件内部对 props 的处理 三、组件通信的几种场景&#xff08;解决方案&#xff09;1.子组件想修改父组件的数据2.子组件传…