4

XML の解析にgSOAPを使用することについていくつか質問があります。誰かがこれを経験したことがあるなら、私にいくつかの助けを与えてください。ありがとう

これまで XML についてまったく知らなかったので、XML を C の構造体に解析する必要があります。その後、gSOAP データ バインディングを使用するための推奨事項をいくつか見つけました。はい!XSD (XML スキーマ) から構造体を含むヘッダー ファイルを生成するのに役立ちます。しかし、構造体や XML ファイルをどうすればよいかわかりません。XML データを構造体に自動的に配置する必要があります (つまり、XSD が変更された場合、コードも変更する必要はありません)。私の問題に関連する gSOAP について、私が知らないことはありますか? それとも、データを入れるために自分でコーディングする必要がありますか? ご心配とお時間をいただきありがとうございます。

乾杯!

- - 添加 - -

これは私が行ったことです。Linuxのターミナルで作業しました。try.xsdという名前のXSDファイルがあります

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='Root'>
        <xs:complexType>
        <xs:sequence>
            <xs:element name='Customers'>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name='Customer' type='xs:string' minOccurs='0' maxOccurs='unbounded' />
                        <xs:element name='Order' type='xs:string' minOccurs='0' maxOccurs='unbounded' />
                    </xs:sequence>
                    <xs:attribute name='customerid' use='required' type='xs:integer'/>
                </xs:complexType>
        </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

次に、この XSD ファイルで gSOAP を使用します。

wsdl2hでtry.hファイルを生成しました

wsdl2h -c -a -o try.h -t typemap.dat try.xsd

次に、残りのファイルを生成しました:ns1.nsmap、soapC.c soapH.H soapClient.c soapServer.c soapStub.h by

soapcpp2 -c -t -L -I "/home/celia/Documents/gsoap-2.7/gsoap/import" try.h

次に、.c ファイルを作成し、soapH.h と ns1.nsmap を含めます。また、フォルダに stdsoap2.h と stdsoap2.c を含めます (これらは gSOAP パッケージにあります)。

ファイル soapStub.h で、構造体が構築されます。

....
struct _ns1__Root_Customers
{
    int __sizeCustomer;     /* sequence of elements <Customer> */
    char **Customer;        /* optional element of type xsd:string */
    int __sizeOrder;        /* sequence of elements <Order> */
    char **Order;               /* optional element of type xsd:string */
    char *customerid;       /* required attribute of type xsd:integer */
}

struct _ns1__Root
{
    struct _ns1__Root_Customers Customers;        /* required element of type ssrf1:Akar-Customers */
}
....

そのため、手動で「Customers->customerid = node->children->content」を使用せずに、XML データをこの構造体に自動的に移動させるコーディング方法について混乱しています。したがって、XSD が変更された場合、コードも変更する必要はありません。

4

2 に答える 2

0

Cには、構造体を満たすクラスがあるシリアライゼーション/デシリアライゼーションオブジェクト(C++やc#とは異なります)はありません。「read」および「memcpy」関数を使用して、自分でコーディングする必要があります。それが私がやったことです、私は同じ問題を抱えていましたが、今は私が知らない新しい何かがあるかもしれません.

于 2013-10-24T12:22:49.853 に答える