已经在谷歌/其他各种网站上搜索了一段时间。。。
剧情简介:无法序列化/反序列化对象、错误的元素类型或null节点(om_element.c)。
生成的代码:
xsi_type_attri = axiom_attribute_create (env, "type", "LocomotiveInformationTransaction", xsi_ns);
//The following line results in ERROR:
axiom_element_add_attribute (parent_element, env, xsi_type_attri, parent);
错误(来自wlis.log)
[error] om_element.c(283) Wrong element type or null node
wsdl文件的一部分:
<?xml version="1.0" encoding="UTF-8"?>
<!-Created by TIBCO WSDL->
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns0="http://www.nscorp.com" xmlns:tns="http://www.nscorp.com" xmlns:ns1="java:com.nscorp.wlis.locoinfo" name="Untitled" targetNamespace="http://www.nscorp.com">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.nscorp.com" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:import namespace="java:com.nscorp.wlis.locoinfo"/>
<xs:element name="UpdateLocoStatus" nillable="true" type="ns1:LocomotiveInformationTransaction"/>
<xs:element name="UpdateLocoStatusResponse" nillable="true" type="ns1:LocomotiveResponse"/>
<xs:element name="isAliveResponse" nillable="true" type="xs:string"/>
</xs:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:stns="java:com.nscorp.wlis.locoinfo" xmlns="java:com.nscorp.wlis.locoinfo" targetNamespace="java:com.nscorp.wlis.locoinfo" elementFormDefault="qualified" attributeFormDefault="qualified">
<xsd:complexType name="ArrayOfCondition">
<xsd:sequence>
<xsd:element name="Condition" nillable="true" type="stns:Condition" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
我能看到的唯一突出的是它的命名空间使用。在这种情况下,它看起来像(在遍历代码之后以及许多调试日志语句)使用默认的"xsi"命名空间。尝试将"ns1"硬编码为的命名空间机车信息交易,但这并没有解决问题。
如果您需要更多信息,请告诉我。
错误表明您给定的parent_element
不是AXIOM_ELEMENT
或没有绑定元素。
在元件检查期间,此条件成立:
if (!axiom_node_get_data_element(element_node, env) ||
axiom_node_get_node_type(element_node, env) != AXIOM_ELEMENT)
这可能是在您将其他节点类型(文本、节点等)传递为parent_element
的情况下发生的。
在axiom_element_add_attribute
呼叫之前检查您的parent_element
:
调用
axiom_node_get_data_element(parent_element, env)
检查数据元素是否绑定。它必须不是NULL
;调用
axiom_node_get_node_type(parent_element, env)
检查元素的类型。它必须是AXIOM_ELEMENT
。
我相信你的意思是检查parent
(而不是parent_element
),对吧?这里有些地方不对劲。
类型def:axiom_node_t *parent
和axiom_element_t *parent_element
以下
调用:axiom_element_add_attribute (parent_element, env, xsi_type_attri, parent);
即
axiom_element_add_attribute(
axiom_element_t * om_element,
const axutil_env_t * env,
axiom_attribute_t * attribute,
axiom_node_t * element_node){...}
在该职能范围内:axiom_element_find_namespace(om_element, env, element_node,...);
被调用。
以下是检查element_node
,它是AXIOM_DATA_SOURCE
(不是AXIOM_ELEMENT
):
if(!axiom_node_get_data_element(element_node, env) || axiom_node_get_node_type(element_node,
env) != AXIOM_ELEMENT)
parent
是AXIOM_DATA_SOURCE
,这可能是wsdl
文件中的内容吗?但是什么?相同的wsdl
文件与gSOAP
一起工作良好。
想法?