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.mzph.cn/news/766865.shtml

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

相关文章

2020年黑龙江省水稻种植分布数据

黑龙江省&#xff0c;位于中国最东北部&#xff0c;是我国位置最北、最东&#xff0c;纬度最高&#xff0c;经度最东的省份&#xff0c;气候为温带大陆性季风气候。黑龙江省土地总面积为47.3万平方公里&#xff08;含加格达奇和松岭区&#xff09;&#xff0c;占全国土地总面积…

HTML元素语义化补充之css函数(三)

文章目录 CSS中的函数css函数–varcss函数–calccss函数–blurcss函数–gradientlinear-gradient的使用 CSS中的函数 ◼ 在前面我们有使用过很多个CSS函数: 比如rgb/rgba/translate/rotate/scale等; CSS函数通常可以帮助我们更加灵活的来编写样式的值&#xff1b; ◼ 下面有几…

Nature:“量子龙卷风”首次模拟黑洞

科学家们在超流体氦气中首次创造出了一个巨大的“量子漩涡”&#xff08;quantum vortex&#xff09;&#xff0c;用以模拟黑洞。这一成就不仅使他们能够更加细致地观察模拟黑洞的行为&#xff0c;还能探究其与周围环境的交互作用。 诺丁汉大学的研究团队与伦敦国王学院和纽卡斯…

春天到了,颈椎病容易复发和加重,怎么回事?

即将进入四月&#xff0c;气温回暖&#xff0c;大家的着装明显轻便了。实际上&#xff0c;四时之气均有诱发颈椎病复发的因素&#xff0c;春天也不例外。 对于颈椎病人群来说&#xff0c;他们的颈部状态较差&#xff0c;遇到“无孔不入”、挟裹着湿气的风邪&#xff0c;便十分容…

操作系统原理-模拟进程创建、终止、阻塞、唤醒原语——沐雨先生

一、实验题目&#xff1a; 模拟进程创建、终止、阻塞、唤醒原语 二、实验目的&#xff1a; 通过设计并调试创建、终止、阻塞、唤醒原语功能&#xff0c;有助于对操作系统中进程控制功能的理解&#xff0c;掌握操作系统模块的设计方法和工作原理。 三、实验环境&#xff1a; …

【算法分析与设计】翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例…

本地运行环境工具UPUPWANK(win)和Navicat数据库管理工具

UPUPWANK安装地址&#xff1a;https://www.upupw.net 1.进入UPUPWANK后点击一键开启 2.新增项目 这里请千万注意80端口&#xff0c;如果80端口被占用了&#xff0c;请记住去任务管理器关闭占用80端口的进程。不然就不会成功显示。&#xff08;笔者含泪警告&#xff0c;一晚上的…

Spring中的OAuth2

一. 什么是OAuth2 “Auth” 表示 “授权” Authorization “O” 是 Open 的简称&#xff0c;表示 “开放” 连在一起就表示 “开放授权”&#xff0c;OAuth2是一种开放授权协议。 二. OAuth2是什么 怎么用 OAuth2是目前最流行的授权协议&#xff0c;用来授权第三方应用&am…

信号的小波包能量谱计算(以轴承振动信号为例,Python环境)

小波分析是近30年来发展起来的数学分支&#xff0c;是Fourier分析划时代发展的结果&#xff0c;由法国工程师Morlet首先提出&#xff0c;后广泛应用于信号处理、图像处理与分析、地震勘探、故障诊断、自动控制等领域&#xff0c;小波就是小的波形&#xff0c;所谓“小”是指它具…

QT文件读写操作和内容提取

访问IO设备&#xff0c;需要先调用open()来设置正确的OpenMode(例如ReadOnly或ReadWrite) 打开设备后后&#xff0c;使用write() 或putChar() 写入数据到文件和设备&#xff0c;并通过调用read()&#xff0c;readLine() 或readAll() 进行读取&#xff1b;使用完设备后&#xf…

3、Jenkins持续集成-Jenkins安装和插件管理

文章目录 一、Jenkins安装1. 安装JDK2. 获取jenkins安装包3. 安装包上传到服务器&#xff0c;进行安装4. 修改Jenkins配置&#xff08;1&#xff09;低版本Jenkins的rpm包&#xff08;2&#xff09;高版本Jenkins的rpm包 5. 启动Jenkins6. 打开浏览器访问7. 获取并输入admin账户…

【漏洞复现】netgear路由器 boarddataww 存在RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

FDM3D打印系列——美纹纸遮挡喷漆

大家好&#xff0c;我是阿赵。   自从上次尝试了水补土和喷漆&#xff0c;发现效果不错之后&#xff0c;我就接着进行第二次的尝试了。   这次打印的模型是这个拳皇里面的卢卡尔&#xff0c;别看拍照好像很高大&#xff0c;其实这个模型很小的&#xff0c;只有10cm左右的高…

PySide6-YOLO8目标检测、追踪可视化界面

目录 项目地址实现效果DetectTrack 项目地址 https://github.com/zhengjie9510/pyside-yolo 实现效果 Detect Track

windows安装ssh

一、下载ssh https://github.com/PowerShell/Win32-OpenSSH/releases/download/v8.1.0.0p1-Beta/OpenSSH-Win64.zip 二、安装ssh 解压到C:\Program Files\OpenSSH-Win64 配置环境变量 把 C:\Program Files\OpenSSH-Win64 加到path环境变量里面 C:\Program Files\OpenSSH-Win64&…

Arcgis 导入经纬度坐标、导出经纬度坐标

目录 一、导入经纬度坐标 1、在excel中准备好经纬度坐标的数据表 2、将数据放入Acrgis的工作路径 3、在arcgis中添加数据 4、显示经纬度坐标点 5、导出为shp矢量文件 二、根据shp的经纬度坐标点导出成经纬度坐标 1、右键选择打开属性表 2、在属性表的菜单下拉栏里找到…

三、阅读器的开发--1、项目准备

1、项目准备 1.1、项目搭建 我用的脚手架是vue cli 5.0的&#xff0c;通过vue create 项目名称来创建的项目 上下箭头选的是最后那个&#xff0c;是指手动配置&#xff0c;然后回车 空格选中下面这些&#xff0c;然后回车 下图最后那个指我们所有的配置在哪里配置&#xff0…

百度智能云+SpringBoot=AI对话【人工智能】

百度智能云SpringBootAI对话【人工智能】 前言版权推荐百度智能云SpringBootAI对话【人工智能】效果演示登录AI对话 项目结构后端开发pom和propertiessql_table和entitydao和mapperservice和implconfig和utilLoginController和ChatController 前端开发css和jslogin.html和chat.…

MySQL 8.0-索引- 不可见索引(invisible indexes)

概述 MySQL 8.0引入了不可见索引(invisible index)&#xff0c;这个在实际工作用还是用的到的&#xff0c;我觉得可以了解下。 在介绍不可见索引之前&#xff0c;我先来看下invisible index是个什么或者定义。 我们依然使用拆开来看&#xff0c;然后再把拆出来的词放到MySQL…

kali安装docker(亲测有效)

第一步&#xff1a;添加Docker官方的GPG密钥 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - 第二步&#xff1a; 第二步更新源 echo deb https://download.docker.com/linux/debian stretch stable> /etc/apt/sources.list.d/docker.list…