如何同时在swift中使用多个xmlparsers?
How to use multiple xmlparsers in swift at the same time?
在Swift。当我使用 xmlparser 为一个实例呈现数据时,它工作正常,但如果我尝试呈现两个不同的 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 添加到一个新的 class 并从那里初始化它,它将不会进入 didStartElement (因为我猜第一个 xmlParser 当前正忙)。
编辑:
我尝试了很多不同的方法来添加第二个解析器。我现在尝试的方法是我在单独的 class 中有第二个解析器,如下所示:
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
}
}
}
}
当我 运行 第一个解析器时,我也调用了 initializeSecondParser() 但这不起作用,因为从未调用过 didStartElement。
let someClassViewController = SomeClassViewController();
someClassViewController.initializeSecondParser();
我也试过使第二个调用异步,但没有成功:
DispatchQueue.main.async {
let someClassViewController = SomeClassViewController();
someClassViewController.initializeSecondParser();
}
您需要正确分离解析器:
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?
}
}
然后检查每个委托方法。因此,如果您忘记在其中一种方法中进行检查,您可能会得到奇怪的结果...
在Swift。当我使用 xmlparser 为一个实例呈现数据时,它工作正常,但如果我尝试呈现两个不同的 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 添加到一个新的 class 并从那里初始化它,它将不会进入 didStartElement (因为我猜第一个 xmlParser 当前正忙)。
编辑:
我尝试了很多不同的方法来添加第二个解析器。我现在尝试的方法是我在单独的 class 中有第二个解析器,如下所示:
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
}
}
}
}
当我 运行 第一个解析器时,我也调用了 initializeSecondParser() 但这不起作用,因为从未调用过 didStartElement。
let someClassViewController = SomeClassViewController();
someClassViewController.initializeSecondParser();
我也试过使第二个调用异步,但没有成功:
DispatchQueue.main.async {
let someClassViewController = SomeClassViewController();
someClassViewController.initializeSecondParser();
}
您需要正确分离解析器:
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?
}
}
然后检查每个委托方法。因此,如果您忘记在其中一种方法中进行检查,您可能会得到奇怪的结果...