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"));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 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();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;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/280488.html

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

相关文章

流畅的 Python 第二版(GPT 重译)(九)

第四部分&#xff1a;控制流 第十七章&#xff1a;迭代器、生成器和经典协程 当我在我的程序中看到模式时&#xff0c;我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象&#xff0c;至少对我来说&#xff0c;这表…

【数据可视化】Echarts中的其它图表

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 绘制散点图2.1 绘制基本散点图2.2 绘制两个序列的散点图2.3 绘制带涟漪特效的散点图 3. 绘制气泡图3.1 绘制标准气泡图3.2 绘制各国人均寿命与GDP气泡图3.3 绘制城市A、城市B、城市C三个城市空气污染指数气…

Tech Talks技术讲座中文培训-报名学习LPWAN、Matter、蓝牙和Wi-Fi最新开发技能!

Silicon Labs&#xff08;亦称“芯科科技”&#xff09;主办新一轮2024年“亚太区Tech Talks在线技术讲座”即将在5月9日至8月8日&#xff08;中文系列场次&#xff09;&#xff0c;以及4月24日至8月7日&#xff08;英文系列场次&#xff09;正式展开&#xff0c;现正热烈报名中…

uniapp使用Canvas给图片加水印把临时文件上传到服务器

生成的临时路径是没有完整的路径没办法上传到服务器 16:37:40.993 添加水印后的路径, _doc/uniapp_temp_1710923708347/canvas/17109238597881.png 16:37:41.041 添加水印后的完整路径, file://storage/emulated/0/Android/data/com.jingruan.zjd/apps/__UNI__BE4B000/doc/…

ES 常见面试题及答案

目录 es 写入数据流程 es 删除数据流程 es 读数据流程 es 部署的服务有哪些角色 es 的实现原理 es 和lucence 关系 如何提高写入效率 提高搜索效率 es doc value指的啥 分片指的啥&#xff0c;定义后可不可义再修改 深分页如何优化 对于聚合操作是如何优化的 元数据…

adobe animate 时间轴找不到编辑多个帧按钮

如题&#xff0c;找了半天&#xff0c;在时间轴上找不到编辑多个帧按钮,导致无法批量处理帧 然后搜索发现原来是有些版本被隐藏了&#xff0c;需要再设置一下 勾选上就好了

POI和EasyExcel区别和操作Excel

POI和EasyExcel操作Excel 常用场景 1、将用户信息导出为excel表格&#xff08;导出数据… &#xff09; 2、将Excel表中的信息录入到网站数据库&#xff08;文件数据上传… &#xff09; 开发中经常会设计到excel的处理&#xff0c;如导出Excel&#xff0c;导入Excel到数据库…

鸿蒙Harmony应用开发—ArkTS-转场动画(组件内隐式共享元素转场)

geometryTransition用于组件内隐式共享元素转场&#xff0c;在组件显示切换过程中提供平滑过渡效果。通用transition机制提供了opacity、scale等转场动效&#xff0c;geometryTransition通过id绑定in/out组件(in指入场组件、out指出场组件)&#xff0c;使得组件原本独立的trans…

Gateway新一代网关

Gateway新一代网关 1、概述 ​ Cloud全家桶中有个很重要的组件就是网关&#xff0c;在1.x版本中都是采用的Zuul网关&#xff1b; ​ 但在2.x版本中&#xff0c;zuul的升级一直跳票&#xff0c;SpringCloud最后自己研发了一个网关SpringCloud Gateway替代Zuul。 ​ 官网&…

手机运营商二要素检测:重塑信任基石,筑牢信息安全屏障

随着移动互联网的普及和数字经济的快速发展&#xff0c;用户信息安全的重要性日益凸显。运营商二要素检测作为一种强大的安全验证机制&#xff0c;以其精准匹配与实时验证的特性&#xff0c;为各类应用场景提供了一种可靠的身份识别解决方案&#xff0c;正在成为众多企业和服务…

C++:继承:面向对象编程的重要特性

(❁◡❁)(●◡●)╰(*▽*)╯(*/ω&#xff3c;*)(^///^)(❁◡❁)(❁◡❁)(●◡●)╰(*▽*)╯(*/ω&#xff3c;*)(❁◡❁)(●’◡’●)╰(▽)╯(/ω&#xff3c;)(///) C&#xff1a;继承&#xff1a;面向对象编程的重要特性 前言**继承**1.继承的概念及定义1.1继承的概念1.2继…

Redis6.0多线程的疑惑解答

1.Redis6.0之前的版本真的是单线程吗&#xff1f; Redis在处理客户端的请求是&#xff0c;包括获取(socket读)、解析、执行、内容返回(socket 写)等都有一个 顺序串行的主线程处理&#xff0c;这就是所谓的"单线程"。但如果严格来讲并不是单线程&#xff0c;除了主线…

SpringMVC学习笔记

SpringMVC 本篇笔记是基于尚硅谷学习资料的整理&#xff0c;涉及到其笔记的简化&#xff0c;补充&#xff0c;以及我在学习中遇到的与无法理解的问题及解决&#xff0c;如果想看完整及后续的笔记&#xff0c;可以去https://www.wolai.com/v5Kuct5ZtPeVBk4NBUGBWF查看官方笔记。…

演讲嘉宾公布 | 3D音频专题论坛将于3月27日举办

一、3D音频专题论坛 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验&#xff0c;跨越时空的限制&#xff0c;探索未知的世界。同时&#xff0c;提供更加丰富、立体的情感表达和交流方式&#xff0c;让人类能够更加深入地理解彼此&#xff0c;建立更加紧密的联系。3D音频未…

MongoDB系列之查询计划

概述 一个查询具体如何被执行的过程&#xff0c;称为查询计划。MongoDB采用自底向上的方式来构造查询计划&#xff0c;每一个查询计划&#xff08;query plan&#xff09;都会被分解为若干个有层次的阶段&#xff08;stage&#xff09;。整个查询计划最终会呈现出一颗多叉树。…

Windows管理多版本nodejs方法

参考&#xff1a;window操作系统安装多个版本的nodejs——nodejs版本控制工具nvm_windows node多版本共存-CSDN博客 前排&#xff1a; 建议把原来电脑装的nodejs卸载干净&#xff0c;再干这个步骤&#xff0c;可以避免出现一些状况&#xff1b;&#xff1b;&#xff1b;另&…

免费PDF转换和编辑工具 PDFgear 2.1.4

PDFgear是一款功能强大的 PDF 阅读及转换软件。 它支持多种文件格式的转换和编辑&#xff0c;同时还提供了丰富的功能模块&#xff0c;如签名、表单填写等&#xff0c;方便用户进行多样化的操作。 该软件界面简洁美观&#xff0c;操作简单易懂&#xff0c;适合不同层次的用户…

【论文阅读】通过组件对齐评估和改进 text-to-SQL 的组合泛化

Measuring and Improving Compositional Generalization in Text-to-SQL via Component Alignment NAACL 2022| CCF B Abstract 在 text-to-SQL 任务中&#xff0c;正如在许多 NLP 中一样&#xff0c;组合泛化是一个重大挑战&#xff1a;神经网络在训练和测试分布不同的情况…

iostream、fstream、sstream、string、vector、unordered_map、stack

iostream 用于输入输出操作&#xff0c;包含了处理标准输入输出流的功能&#xff08;例如&#xff0c;cin, cout, cerr等&#xff09;。 #include <iostream>int main() {int number;std::cout << "Enter a number: ";std::cin >> number;std::…

基于Springboot的防疫物资管理信息系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的防疫物资管理信息系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…