使用gSOAP生成的C++代码无法解析anyAttribute问题求助
gSOAP未解析XSD anyAttribute自定义属性的问题解决
问题原因
- anyAttribute默认验证规则限制:XSD中
<xs:anyAttribute>默认使用processContents="strict"模式,要求所有自定义属性必须匹配已声明的Schema规则,未声明的属性会被gSOAP直接忽略。 - 解析模式未开启ANY支持:当前代码的
soap_set_mode未添加SOAP_XML_ANY标志,gSOAP不会处理anyAttribute相关内容。 - 代码生成阶段配置缺失:若生成代码时未保留anyAttribute支持,会导致结构体中无法生成
__anyAttribute成员。
解决方案
1. 修改XSD的anyAttribute配置
将<xs:anyAttribute>改为宽松验证或跳过验证模式,允许解析未声明的自定义属性:
<!-- 宽松验证:尝试匹配已知规则,匹配失败则保留属性 --> <xs:anyAttribute processContents="lax"/> <!-- 完全跳过验证:直接保留所有自定义属性(更适合扩展场景) --> <xs:anyAttribute processContents="skip"/>
2. 重新生成gSOAP代码
使用正确的命令参数生成代码,确保anyAttribute支持被保留:
# 生成头文件 xsd2h -o test.h test.xsd # 生成C++代码(-C表示仅客户端代码,-j生成C++类,按需选择) soapcpp2 -C -j test.h
检查生成的头文件(如test.h),确认TestElement结构体包含__anyAttribute成员:
struct TestElement { char *someNormalContent; struct soap__attr *__anyAttribute; };
3. 调整解析代码的SOAP模式
初始化soap上下文时添加SOAP_XML_ANY标志,开启anyAttribute解析支持:
soap_set_mode(soap, SOAP_XML_GRAPH | SOAP_C_UTFSTRING | SOAP_XML_ANY);
4. 遍历获取自定义属性
__anyAttribute是链表结构,需要遍历才能获取所有自定义属性:
struct soap__attr *attr = testElement->__anyAttribute; while (attr != nullptr) { const char* attrName = attr->key; // 属性名,如"myExtension" const char* attrValue = attr->value; // 属性值,如"someMoreText" // 处理属性逻辑... attr = attr->next; }
内容的提问来源于stack exchange,提问作者CJacker
相关产品推荐
相关产品推荐

