Copy link to clipboard
Copied
Hello all,
I am having a terrible time parsing an XML doc that is being returned from a service. I think it might be because I upgraded to CF11 and perhaps something is out of date.
Normally I try to get this figured out myself but I just have spent too much time on something I'm sure is very easy.
Here is what is being returned:
<?xml version="1.0" encoding="utf-8"?>
<WebServiceGeocodeResult version="4.10">
<QueryMetadata>
<TransactionId>512a8c85-8258-498c-88a2-c75289e3cb25</TransactionId>
<Version>4.1</Version>
<QueryStatusCodeValue>200</QueryStatusCodeValue>
<FeatureMatchingResultType>Success</FeatureMatchingResultType>
<FeatureMatchingResultCount>1</FeatureMatchingResultCount>
<TimeTaken>0.0390039</TimeTaken>
<ExceptionOccured>False</ExceptionOccured>
<Exception />
<ErrorMessage />
</QueryMetadata>
<InputAddress>
<StreetAddress>1 S MAIN ST Akron OH 44308</StreetAddress>
<City>Akron</City>
<State>OH</State>
<Zip>44308</Zip>
</InputAddress>
<OutputGeocodes>
<OutputGeocode>
<Latitude>41.0847797927252</Latitude>
<Longitude>-81.5166029848824</Longitude>
<NAACCRGISCoordinateQualityCode>02</NAACCRGISCoordinateQualityCode><NAACCRGISCoordinateQualityType>Parcel</NAACCRGISCoordinateQualityType>
<MatchScore>100</MatchScore>
<MatchType>Exact</MatchType>
<FeatureMatchingResultType>Success</FeatureMatchingResultType>
<FeatureMatchingResultCount>1</FeatureMatchingResultCount>
<FeatureMatchingGeographyType>Parcel</FeatureMatchingGeographyType>
<RegionSize>553.366764519364</RegionSize>
<RegionSizeUnits>Meters</RegionSizeUnits>
<MatchedLocationType>LOCATION_TYPE_STREET_ADDRESS</MatchedLocationType>
<ExceptionOccured>False</ExceptionOccured>
<Exception />
<ErrorMessage />
</OutputGeocode>
</OutputGeocodes>
</WebServiceGeocodeResult>
And here is the code that is parsing:
Application.Functions.Dump(HTTPObject, "HTTPObject");
//Remove everything before "<?xml"
HTTPContent = Trim(ReReplace(HTTPObject.FileContent, "^.*(<\?xml)", "\1", "All"));
/* Error responses*/
// Bad request. The parameters passed to the service did not match as expected. The Message should tell you what was missing or incorrect.
if(HTTPObject.QueryMetadata.QueryStatusCodeValue eq 400)
{
if(IsDefined("xmlDoc.Error.Message"))
{
throwGeocodeErrorMessage(xmlDoc.Error.Message.XmlText);
}
else
{
throwGeocodeFailed("Could not find required XML fields. XML: '" & HTTPContent & "'");
}
}
xmlDoc = XmlParse(HTTPContent);
if (HTTPObject.QueryMetadata.QueryStatusCodeValue neq 200)
{
throwGeocodeFailed("Error status code returned. Status Code: '" & HTTPObject.Responseheader.Status_Code &
"'. XML: '" & HTTPContent & "'");
}
// Make sure all the required fields are available
else if(Not (
IsDefined("xmlDoc.WebServiceGeocodeResult.QueryStatusCodeValue") and
IsDefined("xmlDoc.WebServiceGeocodeResult.Latitude") and
IsDefined("xmlDoc.WebServiceGeocodeResult.Longitude") and
IsDefined("xmlDoc.WebServiceGeocodeResult.MatchedLocationType")
)
)
{
throwGeocodeFailed("Could not find required XML fields. XML: '" & HTTPContent & "'");
}
//Make sure the response is 200(Success)
if(xmlDoc.WebServiceGeocodeResult.QueryStatusCodeValue.XmlText neq "200")
{
throwGeocodeFailed("QueryStatusCodeValue: '" & xmlDoc.WebServiceGeocodeResult.QueryStatusCodeValue.XmlText &
"' QueryStatusCodeName: '" & xmlDoc.WebServiceGeocodeResult.QueryStatusCodeName.XmlText &
"'. XML: '" & HTTPContent & "'");
}
I think the issue is here: HTTPContent = Trim(ReReplace(HTTPObject.FileContent, "^.*(<\?xml)", "\1", "All"));
Because I am getting errors that suggests that nothing is being parsed properly:
Element QUERYMETADATA.QUERYSTATUSCODEVALUE is undefined in HTTPOBJECT.
Any help would be greatly appreciated!!!
Thanks.
If you use ColdFusion Help | XmlParse on the response you can then get an object you can refer to.
Something like:
HTTPContent = xmlParse(HTTPObject.FileContent);
writeDump(HTTPContent);
You seem to have most of the bits in place, just in the wrong order. You parse the XML later, but it needs to be done earlier if you want to check the status code values.
Copy link to clipboard
Copied
Is HTTPObject actually an CF object or just the raw XML?
Copy link to clipboard
Copied
Hey haxtbh, it is the raw XML. Thanks.
Copy link to clipboard
Copied
I would first dump out the xml and make sure you are receiving it properly. Second, I would run xmlparse on that xml to convert it into a coldfusion xml object and dump that to make sure it is being parsed properly.
I have never had to remove the xml declaration line so I am not sure you are doing that.
Copy link to clipboard
Copied
Hey Dave,
Thanks for replying. Would you have a suggestion on how to code the xmlparse tag? I thought that was decommissioned and therefore have not used it in a while.
Thanks.
Copy link to clipboard
Copied
If you use ColdFusion Help | XmlParse on the response you can then get an object you can refer to.
Something like:
HTTPContent = xmlParse(HTTPObject.FileContent);
writeDump(HTTPContent);
You seem to have most of the bits in place, just in the wrong order. You parse the XML later, but it needs to be done earlier if you want to check the status code values.
Copy link to clipboard
Copied
haxtbh,
Thank you very much. I was able to play around with xmlparse and the order and get it to work.
Thank you so much!!!!