We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

Coldfusion - XMLSearch Help

Reveroom
Reveroom asked
on
Medium Priority
1,004 Views
Last Modified: 2012-05-07
I have the XMl below returned from a Soap request.  I'm interested in the 'SalesLeadsStatisticsRecord' 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.FileContent));
  xmlNode = xmlSearch(xmlContent, "//GetSalesLeadsStatisticsResponse/GetSalesLeadsStatisticsRecords/a:SalesLeadsStatisticsRecords/a:SalesLeadsStatisticsRecord");
</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>

Open in new window

Comment
Watch Question

Commented:
Yet another XPath implementation which doesn't support XPath!

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, "//:GetSalesLeadsStatisticsResponse/:GetSalesLeadsStatisticsRecords/a:SalesLeadsStatisticsRecords/a:SalesLeadsStatisticsRecord");

Author

Commented:
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: "

Commented:
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, "//*:GetSalesLeadsStatisticsResponse/*:GetSalesLeadsStatisticsRecords/a:SalesLeadsStatisticsRecords/a:SalesLeadsStatisticsRecord");

2) localname predicate

xmlNode = xmlSearch(xmlContent, "//*[local-name()='GetSalesLeadsStatisticsResponse']/:[local-name()='GetSalesLeadsStatisticsRecords']/a:SalesLeadsStatisticsRecords/a:SalesLeadsStatisticsRecord");



Author

Commented:
Thanks BigRat, I appreciate you taking the time to look at this.

Still no dice however - same response as previous with both additional options :-(
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION

Author

Commented:
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:Fault><faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode><faultstring 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:Fault></s:Body></s:Envelope>

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.
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.