Xerces-C++是Apache基金会推出的跨平台C++ XML解析库,支持DOM、SAX等多种解析模式,能够处理XML 1.0和1.1规范,还支持XML Schema校验等功能,在C++生态中应用非常广泛。

一、Xerces-C++库的安装方法
1. Linux系统安装
在主流的Linux发行版中,可以直接通过包管理器安装预编译的库文件,以Ubuntu为例,执行以下命令即可完成安装:
# 安装开发包,包含头文件和静态/动态库 sudo apt-get update sudo apt-get install libxerces-c-dev
如果需要自定义编译版本,可以先从官网下载源码包,解压后执行以下编译步骤:
# 解压源码包 tar -zxvf xerces-c-3.2.4.tar.gz cd xerces-c-3.2.4 # 配置编译参数 ./configure --prefix=/usr/local/xerces-c # 编译并安装 make sudo make install
2. Windows系统安装
Windows平台可以直接下载官方提供的预编译二进制包,也可以自行使用Visual Studio编译源码。以下是自行编译的步骤:
- 从Apache官网下载Xerces-C++源码包并解压
- 打开Visual Studio的开发者命令提示符,进入源码目录下的projects/Win32/VC17目录(根据VS版本调整)
- 执行编译命令生成对应的库文件
3. macOS系统安装
macOS平台可以通过Homebrew包管理器快速安装,执行以下命令即可:
brew update brew install xerces-c
二、Xerces-C++库的基础使用
1. 项目配置
使用Xerces-C++库时,需要在项目中指定头文件路径和链接库。以Linux下的g++编译为例,编译命令需要添加以下参数:
# 假设源码文件为main.cpp,头文件在/usr/include,库在/usr/lib g++ main.cpp -o xml_demo -lxerces-c -I/usr/include -L/usr/lib
2. 读取XML文件示例
以下示例演示了使用DOM模式读取XML文件内容并打印节点信息:
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/framework/LocalFileInputSource.hpp>
#include <xercesc/dom/DOMNode.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/DOMNodeList.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <iostream>
using namespace xercesc;
using namespace std;
// XML字符串转本地字符串
XMLCh* strToXMLCh(const char* str) {
XMLCh* xmlch = XMLString::transcode(str);
return xmlch;
}
// 本地字符串转XML字符串
char* xmlChToStr(const XMLCh* xmlch) {
char* str = XMLString::transcode(xmlch);
return str;
}
int main() {
// 初始化Xerces平台
XMLPlatformUtils::Initialize();
// 创建DOM解析器
XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Never); // 不校验
parser->setDoNamespaces(false);
parser->setDoSchema(false);
// 解析本地XML文件,假设文件为test.xml
parser->parse("test.xml");
// 获取DOM文档对象
DOMDocument* doc = parser->getDocument();
if (doc == nullptr) {
cout << "解析XML文件失败" << endl;
delete parser;
XMLPlatformUtils::Terminate();
return -1;
}
// 获取根节点
DOMElement* root = doc->getDocumentElement();
if (root == nullptr) {
cout << "未找到根节点" << endl;
delete parser;
XMLPlatformUtils::Terminate();
return -1;
}
// 打印根节点名称
char* rootName = xmlChToStr(root->getTagName());
cout << "根节点名称:" << rootName << endl;
XMLString::release(&rootName);
// 清理资源
delete parser;
XMLPlatformUtils::Terminate();
return 0;
}
3. 生成XML文件示例
以下示例演示了使用DOM接口生成简单的XML文件并保存到本地:
#include <xercesc/dom/DOMImplementation.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/DOMText.hpp>
#include <xercesc/dom/DOMLSSerializer.hpp>
#include <xercesc/dom/DOMLSOutput.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <iostream>
using namespace xercesc;
using namespace std;
int main() {
// 初始化平台
XMLPlatformUtils::Initialize();
// 获取DOM实现
DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(strToXMLCh("Core"));
if (impl == nullptr) {
cout << "获取DOM实现失败" << endl;
XMLPlatformUtils::Terminate();
return -1;
}
// 创建文档对象
DOMDocument* doc = impl->createDocument(nullptr, strToXMLCh("user"), nullptr);
DOMElement* root = doc->getDocumentElement();
// 添加子节点
DOMElement* nameNode = doc->createElement(strToXMLCh("name"));
DOMText* nameText = doc->createTextNode(strToXMLCh("张三"));
nameNode->appendChild(nameText);
root->appendChild(nameNode);
DOMElement* ageNode = doc->createElement(strToXMLCh("age"));
DOMText* ageText = doc->createTextNode(strToXMLCh("25"));
ageNode->appendChild(ageText);
root->appendChild(ageNode);
// 序列化文档到文件
DOMLSSerializer* serializer = ((DOMImplementationLS*)impl)->createLSSerializer();
DOMLSOutput* output = ((DOMImplementationLS*)impl)->createLSOutput();
output->setByteStream(new LocalFileOutputTarget("output.xml"));
serializer->write(doc, output);
// 清理资源
serializer->release();
output->release();
doc->release();
XMLPlatformUtils::Terminate();
return 0;
}
三、常见问题说明
使用Xerces-C++库时需要注意内存管理,所有通过XMLString::transcode方法生成的字符串都需要调用XMLString::release释放,避免内存泄漏。另外编译时需要保证链接的库版本和头文件版本一致,否则可能出现兼容性问题。
Xerces_C++C++_XML解析XML_parser跨平台_C++库修改时间:2026-06-24 10:03:51