我正在执行xml解析,并在找到的字符委托方法上获取了字符串值,并进行了JSON序列化以获取数据。现在对于某些搜索值字符串已解析良好,并且我正在获取JSON数据,但有时我会遇到错误,例如字符周围的字符串未终止或字符周围的字符串无效。请对此进行帮助。预先感谢。
var currentParsingElement:String = ""
var getLocation:String = ""
//XML Get Loaction
let LocationMessage = "<?xml version='1.0' encoding='UTF-8'?><SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:ns1='http://tempuri.org/'><SOAP-ENV:Body><ns1:GetBROMCoordinateByLatLogRad><ns1:latitude>\(place.coordinate.latitude)</ns1:latitude><ns1:logitude>\(place.coordinate.longitude)</ns1:logitude><ns1:radius>500</ns1:radius></ns1:GetBROMCoordinateByLatLogRad></SOAP-ENV:Body></SOAP-ENV:Envelope>"
let LocationurlString = "http://XYZ/ZZZWebService/API/XXXApiService.svc"
let LocationmsgLength = String(LocationMessage.count)
let LocationUrl = NSURL(string: LocationurlString)!
var LocationRequest = URLRequest(url: LocationUrl as URL)
LocationRequest.addValue("text/xml", forHTTPHeaderField: "Content-Type")
LocationRequest.addValue("http://tempuri.org/XXXApiService/GetBROMCoordinateByLatLogRad", forHTTPHeaderField: "Soapaction")
LocationRequest.addValue(LocationmsgLength, forHTTPHeaderField: "Content-Length")
LocationRequest.httpMethod = "POST"
LocationRequest.httpBody = LocationMessage.data(using: .utf8)
let Locationsession = URLSession.shared
let Locationtask = Locationsession.dataTask(with: LocationRequest as URLRequest) { (data, response, error) in
guard let Locationresponse = data,
error == nil else {
print(error?.localizedDescription ?? "Response Error")
return }
print("Track Response: \(String(describing: response))")
let Locationparser = XMLParser(data: Locationresponse)
Locationparser.delegate = self
Locationparser.parse()
}
Locationtask.resume()
//代理XML
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
currentParsingElement = elementName
if elementName == "GetBROMCoordinateByLatLogRadResponse" {
print("Started parsing...")
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
let foundedChar = string.trimmingCharacters(in:NSCharacterSet.whitespacesAndNewlines)
if (!foundedChar.isEmpty) {
if currentParsingElement == "GetBROMCoordinateByLatLogRadResult" {
getLocation += foundedChar
print("Location is",getLocation)
let jsonData = getLocation.data(using: .utf8)
do{
let jsonResponse = try JSONSerialization.jsonObject(with: jsonData!, options: .allowFragments)
print("JSON Data is", jsonResponse) //Response result
guard let jsonArray = jsonResponse as? [[String: Any]]
else {
return
}
print("JSON Array is", jsonArray)
for outletFinderresult in jsonArray {
let outletFinderData = outletFinder()
outletFinderData.BranchName = outletFinderresult["BranchName"] as! String
print("Branch Name", outletFinderData.BranchName)
outletFinderData.BranchType = outletFinderresult["BranchType"] as! String
print("Branch Type", outletFinderData.BranchType)
outletFinderData.BranchContactNo = outletFinderresult["BranchContactNo"] as! String
print("Branch ContactNo", outletFinderData.BranchContactNo)
let getOperatioHours = outletFinderresult["OperationHours"] as! String
let removeN = String(getOperatioHours.filter { !"\n".contains($0) })
outletFinderData.OperationHours = removeN
print("Operation Hours", outletFinderData.OperationHours)
print("Address", outletFinderData.Address)
outletFinderData.Latitude = (outletFinderresult["Latitude"] as! NSString).doubleValue
print("Latitude", outletFinderData.Latitude)
outletFinderData.Longitude = (outletFinderresult["Longitude"] as! NSString).doubleValue
print("Longitude", outletFinderData.Longitude)
self.trackOutletFinder.append(outletFinderData)
}
DispatchQueue.main.async {
self.outletCollectionView.reloadData()
// elf.outletCollectionView.collectionViewLayout.invalidateLayout()
}
} catch let parsingError {
print("Error", parsingError)
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "GetBROMCoordinateByLatLogRadResponse" {
print("Ended parsing...")
}
}
//控制台错误
Location is [ { "$id": "1", "StateName": "SELANGOR", "StateCode": "B", "BusinessType": [], "BranchType": "Pejabat POS", "BranchName": "Pejabat POS KLIA Terminal", "BranchCode": "1070", "BranchAddress1": "Lot 13A,", "BranchAddress2": "Bangunan Terminal Utama,", "BranchAddress3": "", "Postcode": "64000", "City": "KLIA", "Latitude": "2.753897", "Longitude": "101.705483", "BranchContactNo": "03-87873871", "BranchManagerName": "Mahiza Bt Manap", "OperationHours": "Isnin - Jumaat8.30pg - 5.30ptgSabtu8.30pg - 1.00ptg" }, { "$id": "2", "StateName": "SELANGOR", "StateCode": "B", "BusinessType": [], "BranchType": "HUB Antarabangsa", "BranchName": "HUB Parcel Antarabangsa KLIA", "BranchCode": "6100", "BranchAddress1": "Pos Malayasia Mel
Error Error Domain=NSCocoaErrorDomain Code=3840 "Unterminated string around character 783." UserInfo={NSDebugDescription=Unterminated string around character 783.}
Location is &
Error Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}
Location is Kurier", "BranchAddress2": "Jalan Klia S1,", "BranchAddress3": "Kuala Lumpur International Airport,", "Postcode": "64000", "City": "Sepang", "Latitude": "2.737011", "Longitude": "101.722267", "BranchContactNo": null, "BranchManagerName": "Tiada Maklumat", "OperationHours": "" }]
Error Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}