如何通过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();
注意事项
- 必须用
SysFreeString释放获取到的BSTR资源,否则会造成内存泄漏。 - 如果属性值没有命名空间前缀,前缀会为空,此时直接使用本地名称即可。
- 确保
WideStringToString函数能正确完成宽字符串到窄字符串的转换,若没有现成实现,可通过WideCharToMultiByteAPI自行编写。
内容的提问来源于stack exchange,提问作者aprotiere
相关产品推荐
相关产品推荐

