今日、私は初めて libxml を学び始めました。そして、SOAP 応答のルート ノードを見つけるのに苦労し続けました。くそー苦労した。
これはxmlバッファです
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sti_xsd="http://www.openmobilealliance.org/schema/sti/v1_0" xsi:type="soapenv:Envelope">
<soapenv:Body>
<sti_xsd:TranscodingResponse>
<sti_xsd:originatorID>test</sti_xsd:originatorID>
<sti_xsd:operationID>1.0</sti_xsd:operationID>
<sti_xsd:mainReturnResult>
<sti_xsd:returnCode>2000</sti_xsd:returnCode>
<sti_xsd:returnString>All 1 transcoding job(s) succeeded</sti_xsd:returnString>
</sti_xsd:mainReturnResult>
<sti_xsd:totalDuration>121</sti_xsd:totalDuration>
<sti_xsd:jobResult>
<sti_xsd:jobID>JOB26</sti_xsd:jobID>
<sti_xsd:extensionData>
<sti_xsd:property>
<sti_xsd:name>van.sti.trx.MemoryUsage</sti_xsd:name>
<sti_xsd:value>3568808</sti_xsd:value>
</sti_xsd:property>
</sti_xsd:extensionData>
<sti_xsd:mainReturnResult>
<sti_xsd:returnCode>2000</sti_xsd:returnCode>
<sti_xsd:returnString>Successful TranscodingJob (200): Success</sti_xsd:returnString>
</sti_xsd:mainReturnResult>
<sti_xsd:duration>119</sti_xsd:duration>
<sti_xsd:output>
<sti_xsd:contentType>application/vnd.wap.mms-message</sti_xsd:contentType>
<sti_xsd:contentTypeParams>
<sti_xsd:property>
<sti_xsd:name>type</sti_xsd:name>
<sti_xsd:value>application/smil</sti_xsd:value>
</sti_xsd:property>
<sti_xsd:property>
<sti_xsd:name>start</sti_xsd:name>
<sti_xsd:value><mms.smil></sti_xsd:value>
</sti_xsd:property>
</sti_xsd:contentTypeParams>
<sti_xsd:location>cid:133699816987026.JOB26</sti_xsd:location>
<sti_xsd:mediaSize>40693</sti_xsd:mediaSize>
</sti_xsd:output>
</sti_xsd:jobResult>
<sti_xsd:extensionData>
<sti_xsd:property>
<sti_xsd:name>van.sti.trx.session.id</sti_xsd:name>
<sti_xsd:value>STI/gesti05/120514_14h/STI17_23m12s214_00</sti_xsd:value>
</sti_xsd:property>
<sti_xsd:property>
<sti_xsd:name>van.sti.server.hostname</sti_xsd:name>
<sti_xsd:value>getrx01</sti_xsd:value>
</sti_xsd:property>
</sti_xsd:extensionData>
</sti_xsd:TranscodingResponse>
</soapenv:Body>
</soapenv:Envelope>
以下は私のコードです:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
void parseStory ( xmlDocPtr doc, xmlNodePtr cur )
{
xmlChar *key;
cur = cur -> xmlChildrenNode;
printf ( "Here\n" );
while ( cur != NULL )
{
if ( ( !xmlStrcmp ( cur -> name, ( const xmlChar * ) "returnCode" ) ) )
{
key = xmlNodeListGetString ( doc, cur -> xmlChildrenNode,1);
printf ( "keyword: %s\n", key );
xmlFree ( key );
}
cur = cur -> next;
}
return ;
}
static void parseDoc ( char *docname )
{
xmlDocPtr doc;
xmlNodePtr cur;
doc = xmlParseFile ( docname );
if ( doc == NULL )
{
fprintf ( stderr, "Document not parsed successfully. \n" );
return;
}
printf ( "Parsing Successful\n" );
cur = xmlDocGetRootElement ( doc );
if ( cur == NULL )
{
fprintf ( stderr, "empty document \n" );
xmlFreeDoc ( doc );
printf ( "Got the root Node\n" );
if ( xmlStrcmp ( cur->name, ( const xmlChar * ) "soapenv:Envelope" ) )
{
fprintf ( stderr, "Document of the wrong type root node != ");
xmlFreeDoc(doc);
return;
}
printf ( "Got the root \n" );
cur = cur -> xmlChildrenNode;
while ( cur != NULL )
{
if (cur->type == XML_ELEMENT_NODE) {
printf ( "Inside if \n" );
if ( !(xmlStrcmp ( cur->name, ( const xmlChar * ) "mainReturnResult" ) ) )
{
printf ( "Inside \n" );
parseStory ( doc, cur );
}
cur = cur -> xmlChildrenNode;
continue;
}
cur = cur -> next;
}
xmlFreeDoc ( doc );
return;
}
int main ( int argc, char **argv )
{
char *docname;
if ( argc <= 1 )
{
printf ( "Usage: %s docname\n", argv[0] );
return ( 0 );
}
docname = argv [1];
parseDoc ( docname );
return ( 1 );
}
return;
}
述べたように、ルートノードを見つけるのに苦労しています。「間違ったタイプのルートノードのドキュメント!=」と言っています ありがとう。