使用gSOAP解析soap msg

时间:2017-02-16 09:53:13

标签: c++ soap gsoap

我有以下示例xml消息:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"></import>
  <xs:element name="to" type="xs:string"/>
  <xs:element name="from" type="xs:string"/>
  <xs:element name="id" type="xs:string"/>
  <xs:element name="relatesTo" type="xs:string"/>
  <xs:element name="action" type="xs:string"/>
  <xs:element name="version" type="xs:string"/>
  <xs:element name="customComplexElement">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="a"/>
        <xs:element type="xs:string" name="b"/>
        <xs:element type="xs:string" name="c"/>
        <xs:element type="xs:string" name="d"/>
        <xs:element type="xs:string" name="e"/>
        <xs:element type="xs:string" name="f"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我使用其中一个在线工具生成了一个xsd文件:

.ccl-ui-grid {
  height: 350px !important; //random height that skips page scroll
  overflow: scroll;
}

然后我用wsdl2h.exe生成相应的头文件,然后用soapcpp2.exe编译器编译它。 然后我尝试用函数soap_read_customComplexElement()读取xml文件,我得到的只是SOAP_TAG_MISMATCH。这个方法似乎有效,如果我摆脱消息的所有肥皂的东西,但我想知道在gSOAP中是否有一些功能来解析肥皂信封,标题和正文?

1 个答案:

答案 0 :(得分:1)

我有同样的问题。但我刚修好了。 所以,就我而言,我使用这行代码。

struct soap *soap = soap_new1(SOAP_C_UTFSTRING | SOAP_XML_IGNORENS | SOAP_XML_TREE);

关键参数是 SOAP_XML_IGNORENS 。此参数忽略名称空间。

SOAP_XML_IGNORENS   in: ignores the use of XML namespaces in input

此问题的根源在于您不在身体内容中声明命名空间。这就是为什么gSoap不知道如何转换这个xml。

这不会被转换,因为gSoap不知道什么是ns4:

<ns4:ParseKeywords><ns4:Keyword>Hello</ns4:Keyword></ns4:ParseKeywords>

但是,如果我声明名称空间,它将被转换

<ns4:ParseKeywords xmlns:ns4="com.idurdyev.idcommerce:ParseKeywords:1.0"><ns4:Keyword>Hello</ns4:Keyword></ns4:ParseKeywords>