You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C++代码获取XML属性ref的带命名空间完整值?

解决方案:获取带命名空间前缀的完整属性值

当你用get_value()获取ref属性时,返回的是解析后的本地名称部分(UBLVersionID),这是因为DOM将带命名空间前缀的属性值(cbc:UBLVersionID)识别为QName(限定名),自动拆分了前缀和本地名称。要获取完整的带前缀值,可按以下方法实现:

核心思路

通过IXMLDOMAttribute(继承自IXMLDOMNode)的两个方法分别获取前缀和本地名称,再将二者拼接为完整的QName:

  • get_prefix():获取属性值的命名空间前缀(cbc)
  • get_localName():获取属性值的本地名称(UBLVersionID)

修改后的代码示例

IXMLDOMNamedNodeMap* attributes_map;
CHK_HR(node->get_attributes(&attributes_map));
IXMLDOMNode* temp_attr_node;
attributes_map->getNamedItem(L"ref", &temp_attr_node);
IXMLDOMAttribute* temp_attr = static_cast<IXMLDOMAttribute*>(temp_attr_node);

// 获取前缀和本地名称
BSTR prefix_bstr = nullptr;
CHK_HR(temp_attr->get_prefix(&prefix_bstr));
BSTR localName_bstr = nullptr;
CHK_HR(temp_attr->get_localName(&localName_bstr));

// 拼接完整的带前缀属性值
std::wstring full_attr_value;
if (prefix_bstr && SysStringLen(prefix_bstr) > 0) {
    full_attr_value = std::wstring(prefix_bstr, SysStringLen(prefix_bstr)) 
                    + L":" 
                    + std::wstring(localName_bstr, SysStringLen(localName_bstr));
} else {
    full_attr_value = std::wstring(localName_bstr, SysStringLen(localName_bstr));
}

// 转换为std::string(根据需求调整)
std::string full_attr_value_str = WideStringToString(full_attr_value);
std::cout << full_attr_value_str;

// 释放BSTR资源,避免内存泄漏
SysFreeString(prefix_bstr);
SysFreeString(localName_bstr);

// 释放COM对象资源
temp_attr->Release();
temp_attr_node->Release();
attributes_map->Release();

注意事项

  1. 必须用SysFreeString释放获取到的BSTR资源,否则会造成内存泄漏。
  2. 如果属性值没有命名空间前缀,前缀会为空,此时直接使用本地名称即可。
  3. 确保WideStringToString函数能正确完成宽字符串到窄字符串的转换,若没有现成实现,可通过WideCharToMultiByteAPI自行编写。

内容的提问来源于stack exchange,提问作者aprotiere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:37:15