NSXMLParser

1 NSXMLParser

1.1 Initializing a Parser Object

1.2 Managing Delegates

1.3 Managing Parser Behavior

1.4 Parsing

1.5 Obtaining Parser State

2 NSXMLParserDelegate

3 实战演练

3.1 XML文件

3.2 测试

1 NSXMLParser

使用NSXMLParser,我们可以解析XML文档。NSXMLParser通过委托代理的方式,将XML中的元素通过代理返回

1.1 Initializing a Parser Object

/// 通过xml路径生成
public convenience init?(contentsOfURL url: NSURL)

/// 通过NSData生成
public init(data: NSData)

/// 通过流生成
@available(iOS 5.0, *)
public convenience init(stream: NSInputStream)

1.2 Managing Delegates

/// 代理
unowned(unsafe) public var delegate: NSXMLParserDelegate?

1.3 Managing Parser Behavior

/// 是否显示限定名称(parser:didStartElement:namespaceURI:qualifiedName:attributes: and parser:didEndElement:namespaceURI:qualifiedName:)
public var shouldProcessNamespaces: Bool

/// 是否显示命名空间声明(parser:didStartMappingPrefix:toURI: and parser:didEndMappingPrefix:)
public var shouldReportNamespacePrefixes: Bool

/// 是否禁用实体的切换(parser:foundExternalEntityDeclarationWithName:publicID:systemID:)
public var shouldResolveExternalEntities: Bool

1.4 Parsing

/// 开始解析
public func parse() -> Bool

/// 停止解析
public func abortParsing()

/// 解析错误
@NSCopying public var parserError: NSError? { get }

1.5 Obtaining Parser State

/// 外部实体的公共标识符
public var publicID: String? { get }
/// 外部系统的标识符
public var systemID: String? { get }
///
public var lineNumber: Int { get }
///
public var columnNumber: Int { get }

2 NSXMLParserDelegate

关于NSXMLParserDelegate多数情况下,我们只使用下面几个协议。

/// MARK: 解析开始
optional public func parserDidStartDocument(parser: NSXMLParser)

/// MARK: 解析结束
optional public func parserDidEndDocument(parser: NSXMLParser)

/// MARK: 解析出错
optional public func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError)

/// MARK: 解析器每次在XML中找到新的元素时,会调用该方法
optional public func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])

3 实战演练

3.1 XML文件

在项目中创建文件,文件名为Main.xml

<?xml version="1.0" encoding="UTF-8"?>
<users xmlns="http://blog.csdn.net/y550918116j">
    <user id="0" name="阳君" qq="937447974"/>
    <user id="1" name="阳君" qq="937447974"/>
</users>

3.2 测试

//
// YJXMLParserVC.swift
// YJFoundation
//
// CSDN:http://blog.csdn.net/y550918116j
// GitHub:https://github.com/937447974/Blog
//
// Created by admin on 16/3/10.
// Copyright © 2016年 阳君. All rights reserved.
//

import UIKit

/// NSXMLParser解析XML
class YJXMLParserVC: UIViewController, NSXMLParserDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        if let url = NSBundle.mainBundle().URLForResource("Main", withExtension: "xml") {
            if let parser = NSXMLParser(contentsOfURL: url) {
                parser.shouldProcessNamespaces = false;
                parser.delegate = self;
                parser.parse()
            }
        }
    }

    // MARK: - NSXMLParserDelegate
    // MARK: 解析开始
    func parserDidStartDocument(parser: NSXMLParser) {
        print(__FUNCTION__)
    }

    // MARK: 解析结束
    func parserDidEndDocument(parser: NSXMLParser) {
        print(__FUNCTION__)
    }

    // MARK: 解析出错
    func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
        print("解析错误\(parseError.localizedDescription)")
    }

    // MARK: 解析器每次在XML中找到新的元素时,会调用该方法
    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
        print("\(elementName) - \(namespaceURI) - \(qName) - \(attributeDict)")
    }

}

 

Appendix

Sample Code

Swift

NSXMLParser Class Reference

NSXMLParserDelegate Protocol Reference

Event-Driven XML Programming Guide

Revision History

时间 描述
2015-12-08 博文完成
2016-03-10 博文更新,增加NSXMLParser的相关说明

CSDN:http://blog.csdn.net/y550918116j

GitHub:https://github.com/937447974/Blog

你可能感兴趣的:(ios,xml)