Reputation: 1054
I am accessing a SOAP server via CURL (Its the only way that PHP would connect). This is the response that I'm receiving:
<s:envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:header>
<a:action s:mustunderstand="1">PublicApi/IPropertyService/CreatePropertyResponse</a:action>
</s:header>
<s:body>
<createpropertyresponse xmlns="PublicApi">
<createpropertyresult xmlns:b="http://schemas.datacontract.org/2004/07/EfxFramework.PublicApi.Property" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<message xmlns="http://schemas.datacontract.org/2004/07/EfxFramework.PublicApi">Successfully completed the operation</message>
<result xmlns="http://schemas.datacontract.org/2004/07/EfxFramework.PublicApi">0</result>
<transactiondate xmlns="http://schemas.datacontract.org/2004/07/EfxFramework.PublicApi">2013-05-15T04:07:48.6565312Z</transactiondate>
<b:propertyid>55</b:propertyid>
</createpropertyresult>
</createpropertyresponse>
</s:body>
I'm trying to pull the content of:
<message xmlns="http://schemas.datacontract.org/2004/07/EfxFramework.PublicApi">Successfully completed the operation</message>
<result xmlns="http://schemas.datacontract.org/2004/07/EfxFramework.PublicApi">0</result>
<b:propertyid>55</b:propertyid>
But I can't figure out how to parse it. I've tried "simplexml_load_string" put that throws a bunch of errors such as "namespace warning : xmlns: URI PublicApi is not absolute"
Any Suggestions?
Upvotes: 0
Views: 1086
Reputation: 46435
A bit of a hack, but if the format of the response is always roughly the same, the following might work for you:
?php
// the message would come from somewhere else; I hard code it to test the expression that follows:
$msg='<s:envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:header>
<a:action s:mustunderstand="1">PublicApi/IPropertyService/CreatePropertyResponse</a:action>
</s:header>
<s:body>
<createpropertyresponse xmlns="PublicApi">
<createpropertyresult xmlns:b="http://schemas.datacontract.org/2004/07/EfxFramework.PublicApi.Property" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<message xmlns="http://schemas.datacontract.org/2004/07/EfxFramework.PublicApi">Successfully completed the operation</message>
<result xmlns="http://schemas.datacontract.org/2004/07/EfxFramework.PublicApi">0</result>
<transactiondate xmlns="http://schemas.datacontract.org/2004/07/EfxFramework.PublicApi">2013-05-15T04:07:48.6565312Z</transactiondate>
<b:propertyid>55</b:propertyid>
</createpropertyresult>
</createpropertyresponse>
</s:body>';
// here comes the actual parsing:
$reg1='/<message [^>]*>([^<]*)</';
$reg2='/<result [^>]*>([^<]*)</';
preg_match($reg1, $msg, $m);
print "message: ". $m[1]."\n";
preg_match($reg2, $msg, $m);
print "result: ".$m[1]."\n";
?>
Result of the above:
message: Successfully completed the operation
result: 0
Explanation:
[^>]*>
: "any number of characters that are NOT >
, followed by >
([^<]*)
: "'capture' all characters that are NOT <
. return them in $m[1]
I hope this helps.
Upvotes: 2