Reveroom
asked on
Coldfusion - XMLSearch Help
I have the XMl below returned from a Soap request. I'm interested in the 'SalesLeadsStatisticsRecor d' node (and elements below it). I'm struggling to get my head around exactly what I need to be putting in the xmlSearch to find this. Specifically, the namespaces are throwing me.
This is what I have on the CF side, and below an except from the XML I'm working with;
<cfscript>
xmlContent = XMLParse(trim(cfhttp.FileC ontent));
xmlNode = xmlSearch(xmlContent, "//GetSalesLeadsStatistics Response/G etSalesLea dsStatisti csRecords/ a:SalesLea dsStatisti csRecords/ a:SalesLea dsStatisti csRecord") ;
</cfscript>
This is what I have on the CF side, and below an except from the XML I'm working with;
<cfscript>
xmlContent = XMLParse(trim(cfhttp.FileC
xmlNode = xmlSearch(xmlContent, "//GetSalesLeadsStatistics
</cfscript>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetSalesLeadsStatisticsResponse xmlns="http://affilinet.framework.webservices/Svc">
<SalesLeadsStatisticsRecords xmlns:a="http://affilinet.framework.webservices/types/PublisherStatistics" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:TotalConfirmed>3.29</a:TotalConfirmed>
<a:TotalOpen>0</a:TotalOpen>
<a:TotalCancelled>0</a:TotalCancelled>
<a:SalesLeadsStatisticsRecords>
<a:SalesLeadsStatisticsRecord>
<a:Date>2009-06-29T00:00:53</a:Date>
<a:ProgramTitle>XYZRetailer</a:ProgramTitle>
<a:SubId>bcnx</a:SubId>
<a:CommissionDescription>Sale: 2 % von 164.95 EUR</a:CommissionDescription>
<a:Commission>3.29</a:Commission>
<a:Information>Note in the case of cancellation</a:Information>
<a:CheckDate>2009-06-30T00:00:00</a:CheckDate>
<a:ProgramId>0</a:ProgramId>
<a:TransactionStatus>Confirmed</a:TransactionStatus>
</a:SalesLeadsStatisticsRecord>
</a:SalesLeadsStatisticsRecords>
</SalesLeadsStatisticsRecords>
</GetSalesLeadsStatisticsResponse>
</s:Body>
</s:Envelope>
ASKER
Thanks for the reply, BigRat.
I'd actually already seen that article, and tried various alternatives as possible solutions. Again, no dice.
Doing a straight 'copy & paste' of your code, the following error is returned:
"Prefix must resolve to a namespace: "
I'd actually already seen that article, and tried various alternatives as possible solutions. Again, no dice.
Doing a straight 'copy & paste' of your code, the following error is returned:
"Prefix must resolve to a namespace: "
Nil desperandum, let's try a couple of options
1) any namespace (since exactly what namespace we are using doesn't mater in this case) :-
xmlNode = xmlSearch(xmlContent, "//*:GetSalesLeadsStatisti csResponse /*:GetSale sLeadsStat isticsReco rds/a:Sale sLeadsStat isticsReco rds/a:Sale sLeadsStat isticsReco rd");
2) localname predicate
xmlNode = xmlSearch(xmlContent, "//*[local-name()='GetSale sLeadsStat isticsResp onse']/:[l ocal-name( )='GetSale sLeadsStat isticsReco rds']/a:Sa lesLeadsSt atisticsRe cords/a:Sa lesLeadsSt atisticsRe cord");
1) any namespace (since exactly what namespace we are using doesn't mater in this case) :-
xmlNode = xmlSearch(xmlContent, "//*:GetSalesLeadsStatisti
2) localname predicate
xmlNode = xmlSearch(xmlContent, "//*[local-name()='GetSale
ASKER
Thanks BigRat, I appreciate you taking the time to look at this.
Still no dice however - same response as previous with both additional options :-(
Still no dice however - same response as previous with both additional options :-(
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks BigRat,
I no longer get the namespace error with that, however no results are returned. I did a cfdump of the cfhttp response (which, in hindsight I should have done earlier), and noted that the response is actually an error.
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Faul t><faultco de xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupp orted</fau ltcode><fa ultstring xml:lang="en-US">The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</faultstring></s:Fa ult></s:Bo dy></s:Env elope>
I haven't actually changed anything in the Soap request since bringing it in from soapUI, so I'm even more confused than I was before now! Clearly, this is presumably where the underlying problem is though.
I guess solving that issue is beyond the scope of this question though, so I'll go ahead and award points for giving me the guidance with the original question.
I no longer get the namespace error with that, however no results are returned. I did a cfdump of the cfhttp response (which, in hindsight I should have done earlier), and noted that the response is actually an error.
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Faul
I haven't actually changed anything in the Soap request since bringing it in from soapUI, so I'm even more confused than I was before now! Clearly, this is presumably where the underlying problem is though.
I guess solving that issue is beyond the scope of this question though, so I'll go ahead and award points for giving me the guidance with the original question.
And XPath strictly speaking is NOT namespace aware.
And ColdFusion has a funny way of doing things with default namespaces.
That all said read : http://www.talkingtree.com/blog/index.cfm/2005/11/18/XmlSearchNoNameNamespace
and try puting a colon in from of those nodes with a default name space :-
xmlNode = xmlSearch(xmlContent, "//:GetSalesLeadsStatistic