2014-10-27 34 views
1

我是新來的Swift,我試圖創建一個OSX終端應用程序來解析一個XML文件。我已經將它讀入一個字符串中,但無法弄清楚如何將它解析爲一個結構,然後我可以導航並從中提取數據。看起來NSXMLDocument似乎需要一個URL,而NSXMLParser需要一個委託,但我最初的嘗試無法讓他們工作。如何在OSX上解析Swift 6.1中的XML字符串?

這裏是我到目前爲止有:

import Foundation 
import Cocoa 

let path = "//Users/<path>/someFile.xml" 

var err: NSError? 
let content = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: &err) 

的XML文件的結構是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<Data> 
    <Documents> 
    <List> 
     <Document name="name1" type="TYPE1" date="some string"> 
     <Items> 
      <Item name="item1" dataType="DATATYPE1" version="1"> 
      <Item name="item2" dataType="DATATYPE9" version="4"> 
     </Items> 
     </Document> 
     <Document name="name2" type="TYPE4" date="some string"> 
     ... 
    </List> 
    </Documents> 
</Data> 

你的幫助是非常讚賞。

回答

2

解析XML文檔並不是那麼簡單,不能用代碼中的單行代碼完成。

要與NSXMLParser解析它,你需要一個實現NSXMLParserDelegate協議的自定義類,像這樣:

class myXMLParser: NSObject, NSXMLParserDelegate { 
    ... 

    func parseFile(filename: String) { 
     let url = NSBundle.mainBundle().URLForResource(filename, withExtension: "xml") 

     if let parser = NSXMLParser(contentsOfURL: url) { 
      parser.delegate = self 
      parser.parse() 
     } 
    } 


    func parserDidStartDocument(parser: NSXMLParser!) { 
     ... 
    } 

    func parserDidEndDocument(parser: NSXMLParser!) { 
     ... 
    } 

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

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

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

} 

所以每當你檢索新的元素與didStartElement你要檢查它是什麼元素,什麼孩子元素你期望更進一步。這一切都取決於你的XML文檔的結構,所以在一個解決方案中你可能不會提供所有的解決方案。

0

NSXMLDocument使用看起來像:

let fm = NSFileManager.defaultManager() 
var err : NSError? 
let userDirectory = fm.URLForDirectory(.UserDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false, error: &err) 
if err != nil { 
    // ... 
} 

if let path = userDirectory?.URLByAppendingPathComponent("someFile.xml") { 
    NSXMLDocument(contentsOfURL: configURL, options: 0, error: &err) 
    if err != nil { 
    // ... 
    } 

    if let rootNode = config?.rootElement() { 
    // ... 
    } 
}