在C++中使用xmlXPathRegisterNs
(libxml2)添加多个命名空间时,需要为每个命名空间分别调用该函数
#include <libxml/xpath.h>
#include <iostream>
int main() {
// 初始化libxml2库
xmlInitParser();
// 创建XPath上下文
xmlXPathContextPtr context = xmlXPathNewContext(nullptr);
if (!context) {
std::cerr << "Error creating XPath context" << std::endl;
return 1;
}
// 定义命名空间前缀和URI
const char* prefix1 = "ns1";
const char* uri1 = "http://example.com/ns1";
const char* prefix2 = "ns2";
const char* uri2 = "http://example.com/ns2";
// 注册命名空间
int ret1 = xmlXPathRegisterNs(context, reinterpret_cast<const xmlChar*>(prefix1), reinterpret_cast<const xmlChar*>(uri1));
int ret2 = xmlXPathRegisterNs(context, reinterpret_cast<const xmlChar*>(prefix2), reinterpret_cast<const xmlChar*>(uri2));
if (ret1 != 0 || ret2 != 0) {
std::cerr << "Error registering namespaces" << std::endl;
return 1;
}
// 使用XPath表达式
const char* xpathExpr = "//ns1:element1 | //ns2:element2";
xmlXPathObjectPtr result = xmlXPathEvalExpression(reinterpret_cast<const xmlChar*>(xpathExpr), context);
if (!result) {
std::cerr << "Error evaluating XPath expression" << std::endl;
return 1;
}
// 处理XPath结果
// ...
// 清理资源
xmlXPathFreeObject(result);
xmlXPathFreeContext(context);
xmlCleanupParser();
return 0;
}
在这个示例中,我们注册了两个命名空间:ns1
和ns2
,并分别为它们指定了URI。然后,我们使用XPath表达式//ns1:element1 | //ns2:element2
来选择这两个命名空间中的元素。
领取专属 10元无门槛券
手把手带您无忧上云