快速解析给定elementName的属性名称

这是我网址的一部分

<cities>

<country name="Абхазия">

<city id="37188" region="27028" head="" type="3" country="Абхазия" part="" resort="" climate="">Новый Афон</city>

<city id="37178" region="10282" head="" type="3" country="Абхазия" part="" resort="" climate="">Пицунда</city>

<city id="37187" region="37187" head="" type="3" country="Абхазия" part="" resort="" climate="">Гудаута</city>

<city id="37172" region="10280" head="" type="3" country="Абхазия" part="" resort="" climate="">Гагра</city>

<city id="37189" region="10281" head="0" type="3" country="Абхазия" part="" resort="0" climate="">Сухум</city>

</country>

用户输入城市名称,例如:"Пицунда"我想获取其ID。对于"Пицунда"id是"10282"

下面,我发布了我的无效代码。

var parser: NSXMLParser!

var city: String = String()

var ifDirOK = false

var ifCityNameOK = false

override func viewDidLoad() {

super.viewDidLoad()

let url: NSURL = NSURL(string: "https://pogoda.yandex.ru/static/cities.xml")!

parser = NSXMLParser(contentsOfURL: url)

parser.delegate = self

parser.parse()

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

}

func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) {

//let cityID = attributeDict ["id"] as? NSString

if (elementName == "city"){

ifDirOK = true

}

}

func parser(parser: NSXMLParser!, foundCharacters string: String!) {

var data = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

if (data == city){

ifCityNameOK = true

}

}

func parser(parser: NSXMLParser!, foundAttributeDeclarationWithName attributeName: String!, forElement elementName: String!, type: String!, defaultValue: String!) {

if (ifDirOK && ifCityNameOK){

println("\(attributeName)")

}

}

func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) {

}

毕竟,我想将id传递给另一个URL文件(export.yandex.ru/weather-ng/forecasts/{id of the

city}.xml)并进行解析。我是否需要创建另一个Swift类并以某种方式将其与第一个连接?

回答:

构建[city:id]字典可以为您提供解决方案。我基于http://www.codeproject.com/Articles/248883/Objective-

C-Fundamentals-

NSXMLParser上有关NSXMLParser生命周期的文章,实现了一个简单的解决方案。

当元素开始时,调用以下方法。您可以检索城市ID属性并将其保存在实例级别的变量中,以便可以在下一个方法中使用它。

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject])

然后,当解析器看到开始和结束之间的任何内容时,将调用Following方法。

func parser(parser: NSXMLParser!, foundCharacters string: String!)

因此,您可以从此处获取城市名称。现在我们有了城市ID和城市名称,可以在[city:id]字典中添加新项目。

建立字典后,搜索将非常简单。

这是我的工作测试代码。

class ViewController: UIViewController ,NSXMLParserDelegate{

var parser: NSXMLParser!

var city: String = String()

var ifDirOK = false

var ifCityNameOK = false

var element : String?

var value: String=String()

var dic = Dictionary<String,String>()

var currentCityId:String?

@IBOutlet weak var result: UILabel!

@IBOutlet weak var search: UITextField! //search text

@IBAction func ActionGoGetIt(sender: AnyObject) {

self.result.text=dic[self.search.text]

}

override func viewDidLoad() {

super.viewDidLoad()

let url: NSURL = NSURL(string: "https://pogoda.yandex.ru/static/cities.xml")!

parser = NSXMLParser(contentsOfURL: url)

parser.delegate = self

parser.parse()

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

}

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {

element = elementName

if (element == "city"){

ifDirOK = true

let cityID = attributeDict ["id"] as? NSString

self.currentCityId = cityID as? String

}

}

func parser(parser: NSXMLParser!, foundCharacters string: String!) {

var data = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

if (!data.isEmpty){

if (element == "city"){

dic[data] = self.currentCityId as String?

}

}

}

func parser(parser: NSXMLParser, foundAttributeDeclarationWithName attributeName: String, forElement elementName: String, type: String?, defaultValue: String?) {

if (ifDirOK && ifCityNameOK){

println("\(attributeName)")

}

}

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {

}

}

以上是 快速解析给定elementName的属性名称 的全部内容, 来源链接: utcz.com/qa/412892.html

回到顶部