NSXMLParser简单示例

问题描述:

大多数如何调用NSXMLParser的示例都包含在涉及Apps的复杂项目中。演示回调的简单示例是什么样的。NSXMLParser简单示例

+2

Stack Overflow是,从根本上绝对,一个问题/答案的网站。你可以回答你自己的问题,但你仍然应该遵循这个网站的形式。你的帖子很有用(谢谢!),但它不符合Stack Overflow的意图。请不要太防守,并根据SO实践重构您的帖子。 – bkbeachlabs

+1

注意到下次将坚持更多的Q&A风格。至于GitHub,我不知道如何使用它。 – TJA

+0

您能否将解答复制到下面的答案中,以便我们可以将它解决并从未答复的列表中解决?谢谢。 –

作为探索NSXMLParser的一部分,我创建了以下非常简单的代码。

的main.m

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
     NSLog(@"Main Started"); 

     NSError *error = nil; 

     // Load the file and check the result 
     NSData *data = [NSData dataWithContentsOfFile:@"/Users/Tim/Documents/MusicXml/Small.xml" 
              options:NSDataReadingUncached 
              error:&error]; 
     if(error) { 
      NSLog(@"Error %@", error); 

      return 1; 
     } 


     // Create a parser and point it at the NSData object containing the file we just loaded 
     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 

     // Create an instance of our parser delegate and assign it to the parser 
     MyXmlParserDelegate *parserDelegate = [[MyXmlParserDelegate alloc] init]; 
     [parser setDelegate:parserDelegate]; 

     // Invoke the parser and check the result 
     [parser parse]; 
     error = [parser parserError]; 
     if(error) 
     { 
      NSLog(@"Error %@", error); 

      return 1; 
     } 

     // All done 
     NSLog(@"Main Ended"); 
    } 
    return 0; 
} 

MyXmlParserDelegate.h

#import <Foundation/Foundation.h> 

@interface MyXmlParserDelegate : NSObject <NSXMLParserDelegate> 

@end 

MyXmlParserDelegate.m

#import "MyXmlParserDelegate.h" 

@implementation MyXmlParserDelegate 

- (void) parserDidStartDocument:(NSXMLParser *)parser { 
    NSLog(@"parserDidStartDocument"); 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    NSLog(@"didStartElement --> %@", elementName); 
} 

-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    NSLog(@"foundCharacters --> %@", string); 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    NSLog(@"didEndElement --> %@", elementName); 
} 

- (void) parserDidEndDocument:(NSXMLParser *)parser { 
    NSLog(@"parserDidEndDocument"); 
} 
@end 

我,希望它可以帮助别人的贴吧。

+0

感谢您的出发点。很有帮助。 –

以下是以下原始Objective-C代码的Swift版本。

它是使用XCode 7.3构建和测试的。在写代理时,我发现从文档中复制函数原型非常方便。值得注意的是,Swift目前是一个相当迅速移动的目标。

main.swift

import Foundation 

// Let's go 
print("Main: Started") 

// Try to load the file. Display the description of the error if one occurs 
var xmlData : NSData 
do { 
    xmlData = try NSData(contentsOfFile: "/Users/amt/Documents/TestXml/Test.xml", 
         options: .DataReadingMappedIfSafe) 
} 
catch let error as NSError { 
    print("Main: \(error.description)") 

    exit(1) 
} 

// Create a parser and point it at the NSData object containing 
// the file we just loaded 
var parser : NSXMLParser! = NSXMLParser(data: xmlData) 

// Create a parser delegate object and assign it to the parser 
// Beware the "weak" reference and don't try to combine the two lines 
// of code into one unless you like EXC_BAD_ACCESS exceptions 
var parserDelegate : MyXmlParserDelegate = MyXmlParserDelegate() 
parser.delegate = parserDelegate 

// This example also illustrates some of the namespace functions defined in 
// the delegate protocol so enable namespace reporting to see them invoked 
parser.shouldReportNamespacePrefixes = true 

// Parse the document 
if !parser.parse() { 
    // If parse() returned false then an error occurred so display is location 
    // and details 
    let error = parser.parserError 
    let line = parser.lineNumber 
    let col = parser.columnNumber 
    print("Parsing failed at \(line):\(col): \(error?.localizedDescription)") 
} 

// All done 
print("Main: Ended") 
exit(0) 

MyXmlParserDelegate.swift

import Foundation 

class MyXmlParserDelegate:NSObject, NSXMLParserDelegate { 

    @objc func parserDidStartDocument(parser: NSXMLParser) { 
     print("parserDidStartDocument") 
    } 

    @objc func parser(parser: NSXMLParser, didStartElement elementName: String, 
       namespaceURI: String?, qualifiedName qName: String?, 
       attributes attributeDict: [String : String]) { 
     print("didStartElement  --> \(elementName)") 
    } 

    @objc func parser(parser: NSXMLParser, foundCharacters string: String) { 
     print("foundCharacters  --> \(string)") 
    } 

    @objc func parser(parser: NSXMLParser, didEndElement elementName: String, 
       namespaceURI: String?, qualifiedName qName: String?) { 
     print("didEndElement   --> \(elementName)") 
    } 

    @objc func parser(parser: NSXMLParser, didStartMappingPrefix prefix: String, 
       toURI namespaceURI: String) { 
     print("didStartMappingPrefix --> Prefix: \(prefix) toURI: \(namespaceURI)") 
    } 

    @objc func parser(parser: NSXMLParser, didEndMappingPrefix prefix: String) { 
     print("didEndMappingPrefix --> Prefix: \(prefix)") 
    } 

    @objc func parserDidEndDocument(parser: NSXMLParser) { 
     print("parserDidEndDocument") 
    } 
} 

夫特4实施例 - 解析XIB-文件。

import Foundation 

class XMLTransformer: NSObject { 

    private let parser: XMLParser 
    private var stack = [Node]() 
    private var tree: Node? 

    init(data: Data) { 
     parser = XMLParser(data: data) 
     super.init() 
     parser.delegate = self 
    } 
} 

extension XMLTransformer { 

    func transform() throws -> Node? { 
     parser.parse() 
     if let e = parser.parserError { 
     throw e 
     } 
     assert(stack.isEmpty) 
     assert(tree != nil) 
     return tree 
    } 

} 

extension XMLTransformer: XMLParserDelegate { 

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { 
     guard let tag = Tag(rawValue: elementName) else { 
     return 
     } 
     let node = Node(tag: tag, attributes: attributeDict, nodes: []) 
     stack.append(node) 
    } 

    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
     guard let tag = Tag(rawValue: elementName) else { 
     return 
     } 
     let lastElement = stack.removeLast() 
     assert(lastElement.tag == tag) 
     if let last = stack.last { 
     last.nodes += [lastElement] 
     } else { 
     tree = lastElement 
     } 
    } 
} 

extension XMLTransformer { 

    enum Tag: String { 
     case document 
     case objects 
     case tableViewCell, tableViewCellContentView 
     case subviews 
     case mapView 
     case constraints, constraint 
     case connections, outlet 
    } 
} 

extension XMLTransformer { 

    class Node { 

     let tag: Tag 
     let attributes: [String : String] 
     var nodes: [Node] 

     init(tag: Tag, attributes: [String : String], nodes: [Node] = []) { 
     self.tag = tag 
     self.attributes = attributes 
     self.nodes = nodes 
     } 
    } 
} 

用法:

let data = try xib(named: "MapTableViewCell") 
let c = XMLTransformer(data: data) 
let tree = try c.transform() // Here you have parsed XML in a Tree representation.