SOAP API 正在可选括号中响应 XML。如何迎合它?
SOAP API is responding XML in an Optional Bracket. How to cater it?
我的代码片段是
class ViewController: UIViewController, XMLParserDelegate {
var is_SoapMessage: String = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><CelsiusToFahrenheit xmlns=\"https://www.w3schools.com/xml/\"><Celsius>55</Celsius></CelsiusToFahrenheit></soap:Body></soap:Envelope>"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let is_URL: String = "https://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit"
let lobj_Request = NSMutableURLRequest(url: NSURL(string: is_URL)! as URL)
let session = URLSession.shared
//let err: NSError?
lobj_Request.httpMethod = "POST"
lobj_Request.httpBody = is_SoapMessage.data(using: String.Encoding.utf8)
lobj_Request.addValue("www.w3schools.com", forHTTPHeaderField: "Host")
lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
lobj_Request.addValue(String(is_SoapMessage.characters.count), forHTTPHeaderField: "Content-Length")
lobj_Request.addValue("https://www.w3schools.com/xml/CelsiusToFahrenheit", forHTTPHeaderField: "SOAPAction")
let task = session.dataTask(with: lobj_Request as URLRequest, completionHandler: {data, response, error -> Void in
// print("Response: \(response)")
let strData = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
print(strData)
if error != nil
{
print("Error: ", error!)
}
let xmlParser = XMLParser(data: data!)
xmlParser.delegate = self
//xmlParser.shouldProcessNamespaces = false
//xmlParser.shouldReportNamespacePrefixes = false
//xmlParser.shouldResolveExternalEntities = false
let bool: Bool = xmlParser.parse()
print(bool)
})
task.resume()
}
private func parser(parser: XMLParser, didStartElement: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
// Can see elements in the soap response being printed.
print("Helloa");
}
func parserDidStartDocument(_ parser: XMLParser) {
print("Started")
}
func parserDidEndDocument(_ parser: XMLParser) {
print("Ended")
}
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
print("error")
}
真正调用了所有解析器函数,但从未调用过 didStartElement。我得到的响应在可选标记中,XML 解析器未获取任何元素。猜猜看?See Image Output
更新到最新
func parser(_ parser: XMLParser,
didStartElement elementName: String,
namespaceURI: String?,
qualifiedName qName: String?,
attributes attributeDict: [String : String] = [:]) {}
我的代码片段是
class ViewController: UIViewController, XMLParserDelegate {
var is_SoapMessage: String = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><CelsiusToFahrenheit xmlns=\"https://www.w3schools.com/xml/\"><Celsius>55</Celsius></CelsiusToFahrenheit></soap:Body></soap:Envelope>"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let is_URL: String = "https://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit"
let lobj_Request = NSMutableURLRequest(url: NSURL(string: is_URL)! as URL)
let session = URLSession.shared
//let err: NSError?
lobj_Request.httpMethod = "POST"
lobj_Request.httpBody = is_SoapMessage.data(using: String.Encoding.utf8)
lobj_Request.addValue("www.w3schools.com", forHTTPHeaderField: "Host")
lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
lobj_Request.addValue(String(is_SoapMessage.characters.count), forHTTPHeaderField: "Content-Length")
lobj_Request.addValue("https://www.w3schools.com/xml/CelsiusToFahrenheit", forHTTPHeaderField: "SOAPAction")
let task = session.dataTask(with: lobj_Request as URLRequest, completionHandler: {data, response, error -> Void in
// print("Response: \(response)")
let strData = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
print(strData)
if error != nil
{
print("Error: ", error!)
}
let xmlParser = XMLParser(data: data!)
xmlParser.delegate = self
//xmlParser.shouldProcessNamespaces = false
//xmlParser.shouldReportNamespacePrefixes = false
//xmlParser.shouldResolveExternalEntities = false
let bool: Bool = xmlParser.parse()
print(bool)
})
task.resume()
}
private func parser(parser: XMLParser, didStartElement: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
// Can see elements in the soap response being printed.
print("Helloa");
}
func parserDidStartDocument(_ parser: XMLParser) {
print("Started")
}
func parserDidEndDocument(_ parser: XMLParser) {
print("Ended")
}
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
print("error")
}
真正调用了所有解析器函数,但从未调用过 didStartElement。我得到的响应在可选标记中,XML 解析器未获取任何元素。猜猜看?See Image Output
更新到最新
func parser(_ parser: XMLParser,
didStartElement elementName: String,
namespaceURI: String?,
qualifiedName qName: String?,
attributes attributeDict: [String : String] = [:]) {}