在斯威夫特。當我使用 xmlparser 為 ONE 呈現資料時,它作業正常,但如果我嘗試呈現兩個不同的 xml 資料集,它就無法作業。據我了解 xmlparser 是同步的,所以這會為第二個 xmlparser 呼叫搞砸。那么如何同時(或依次)為兩個不同的資料集渲染 xml 資料?
這就是我渲染我的一個作業正常的資料集的方式。我包括 XMLParserDelegate:
var xmlParser: XMLParser!
self.xmlParser = XMLParser(data: HelperController.sharedInstance.XMLDataObject!)
self.xmlParser.delegate = self
self.xmlParser.parse()
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
eName = elementName
if elementName == "someName" {
//do something
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
let data = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased()
//var jalla = NSString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased()
if (!data.isEmpty) {
//do something
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
eName = ""
if elementName == "someName" {
//do something
}
}
但我需要呈現另一個 XMLDataObject。我怎樣才能做到這一點?如果我將第二個 xmlparsing 添加到一個新類并從那里初始化它,它將不會進入 didStartElement (因為我猜第一個 xmlParser 目前正忙)。
編輯:
我嘗試了很多不同的方法來添加第二個決議器。我現在嘗試的方式是,我在單獨的類中有第二個決議器,如下所示:
class SomeClassViewController: UIViewController, XMLParserDelegate {
var xmlParserSecondParser: XMLParser!
var eName: String = String()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func initializeSecondParser(){
self.xmlParserSecondParser = XMLParser(data:
HelperController.sharedInstance.XMLDataObjectSecond!)
self.xmlParserSecondParser.delegate = self
self.xmlParserSecondParser.parse()
func parser(_ parser: XMLParser, didStartElement elementName:
String, namespaceURI: String?, qualifiedName qName: String?,
attributes attributeDict: [String : String]) {
eName = elementName
if elementName == "someName" {
//do something
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
let data = string.trimmingCharacters(in:
CharacterSet.whitespacesAndNewlines).uppercased()
if (!data.isEmpty) {
//do something
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String,
namespaceURI: String?, qualifiedName qName: String?) {
eName = ""
if elementName == "someName" {
//do something
}
}
}
}
When I run the first parser I also call initializeSecondParser() but that does'nt work since didStartElement is never called.
let someClassViewController = SomeClassViewController();
someClassViewController.initializeSecondParser();
I have also tried to make the second call async but no luck:
DispatchQueue.main.async {
let someClassViewController = SomeClassViewController();
someClassViewController.initializeSecondParser();
}
uj5u.com熱心網友回復:
您需要正確分離決議器:
struct CustomParser: XMLParserDelegate {
let xmlParser: XMLParser
let ename: String = ""
init(with data: Data) {
xmlParser = XMLParser(data: data)
xmlParser.delegate = self
}
// Here its returning the value you want
var parsedResponse: ParsedResponse?
func parse() -> ParsedResponse? {
xmlParser.parse()
return parsedResponse
}
// ParserDelegates
func parser(_ parser: XMLParser, foundCharacters string: String) {
...
}
func parser(_ parser: XMLParser, didEndElement elementName: String,
namespaceURI: String?, qualifiedName qName: String?) {
...
}
...
}
let parser1 = CustomParser(with: HelperController.sharedInstance.XMLDataObjectFirst!)
let parsed1 = parser1.parse()
let parser2 = CustomParser(with: HelperController.sharedInstance.XMLDataObjectSecond!)
let parsed2 = parser2.parse()
這就是我推薦的方式,因為您正確地將決議與UIViewController. 你不會有很大的UIViewController做 XML 決議,還有更多......
您仍然可以使用 2 個決議器,但是您所展示的很少,可能會更難,就是檢查parser它在委托方法中的哪個,并采取相應的行動,但這會增加復雜性并容易出錯(忘記某處并中斷然后一切):
var firstParser: XMLParser!
var firstEName: String = String()
var secondParser: XMLParser!
var secondEName: String = String()
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
if parser == firstParser {
firstEName = elementName
if elementName == "someName" {
//do something
}
} else if parser == secondParser {
secondEName = elementName
if elementName == "someName" {
//do something
}
} else {
//It's another parser, what to do?
}
}
And do that check for each delegate method. So if you forget to do the check in one of the method, you might have weird results...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359606.html
標籤:swift xml xcode xml-parsing
