0

一段时间以来一直在谷歌/其他各种网站上搜索......

概要:无法序列化/反序列化对象、错误的元素类型或空节点 (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”硬编码为 LocomotiveInformationTransaction 的命名空间,但这并没有解决问题。

如果您需要更多信息,请告诉我。

4

2 回答 2

1

该错误表明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.

检查您的通话parent_elementaxiom_element_add_attribute

  1. 调用axiom_node_get_data_element(parent_element, env)以检查数据元素是否已绑定。一定不是NULL

  2. 调用axiom_node_get_node_type(parent_element, env)检查元素的类型。一定是AXIOM_ELEMENT

于 2016-07-20T07:07:12.927 回答
0

我相信你的意思是检查parent(不是parent_element),对吧?这里没有加起来。

输入 def : axiom_node_t *parentaxiom_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_nodewhich 是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.

想法?

于 2016-07-20T16:52:57.750 回答