ios - 使用 NSXMLParser 在 Swift 中解析 XML

标签 ios xml swift parsing nsxmlparser

我有以下要解析的 XML 结构:

<plist version="1.0">
        <dict>
            <key>
                PALABRA
            </key>
            <array>
                <string>
                    CATEGORY
                </string>
                <string>
                    WORD
                </string>
            </array>
        </dict>
</plist> 

我以这种方式使用 NSXMLParser 来解析 XML:

var posts = NSMutableArray()
var parser = NSXMLParser()
var elements = NSMutableDictionary()
var element = NSString()
var CATEGORY = NSMutableString()
var WORD = NSMutableString()

func parseXML() {
        posts = []
        parser = NSXMLParser(contentsOfURL:(NSURL(string:"http://www.serverbpw.com/cm/2016-1/hangman.php"))!)!
        parser.delegate = self
        parser.parse()         
}

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

    element = elementName
    if (elementName as NSString).isEqualToString("array") {
        elements = NSMutableDictionary()
        elements = [:]
        categoria = NSMutableString()
        categoria = ""
    }

    if (elementName as NSString).isEqualToString("string") {
        palabra = NSMutableString()
        palabra = ""
    }
}

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

    if element.isEqualToString("string") {
        categoria.appendString(string)
    }

    if element.isEqualToString("string") {
        palabra.appendString(string)
    }
}

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    if (elementName as NSString).isEqualToString("array") {
        if !categoria.isEqual(nil) {
            elements.setObject(categoria, forKey: "CATEGORIA")
        }
        if !palabra.isEqual(nil) {
            elements.setObject(palabra, forKey: "PALABRA")
        }            
        posts.addObject(elements)
    }
}

我从服务器获取的CATEGORY的值是CATEGORY的内容,也是WORD的内容,而WORD的值只是WORD的内容。 我知道这不是解析 XML 的正确方法。问题是我不知道如何获取 CATEGORY 和 WORD 元素,因为它们都具有相同的 ID(“字符串”)。获取此信息的正确方法是什么?

服务器地址是:http://www.serverbpw.com/cm/2016-1/hangman.php

提前致谢!

最佳答案

如果你要自己解析这个,诀窍是你有两次出现 <string> ,并且您必须以某种方式区分它们。您可以拥有自己的计数器来跟踪哪个是哪个:

var posts: [[String: String]]!
var element: String!
var categoria: String?
var palabra: String?
var stringValue: String?
var counter: Int!

func parseXML(url: NSURL) {
    posts = [[:]]
    let parser = NSXMLParser(contentsOfURL: url)!
    parser.delegate = self
    parser.parse()
}

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
    element = elementName
    if elementName == "array" {
        categoria = nil
        palabra = nil
        counter = 0
    }
}

func parser(parser: NSXMLParser, foundCharacters string: String) {
    if element == "string" {
        if stringValue == nil {
            stringValue = string
        } else {
            stringValue! += string
        }
    }
}

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    if elementName == "string" {
        stringValue = stringValue?.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
        if counter == 0 {
            categoria = stringValue
        } else if counter == 1 {
            palabra = stringValue
        }
        stringValue = nil
        counter!++
    }

    if elementName == "array" {
        var element = [String: String]()
        if categoria != nil {
            element["CATEGORIA"] = categoria
        }
        if palabra != nil {
            element["PALABRA"] = palabra
        }            
        posts.append(element)
    }
}

但我同意 cezheng 的观点,这似乎是一个 NSDictionary plist,因此,你应该只使用 NSDictionary(contentsOfFile)或者你有什么。如果这真的是您正在构建的 XML,我会建议使用不同的格式,例如:

<posts>
    <post>
        <category>
            CATEGORY
        </category>
        <word>
            WORD
        </word>
    </post>
</posts> 

然后你可以更容易地解析它,而不需要 counter 的愚蠢.

关于ios - 使用 NSXMLParser 在 Swift 中解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33618841/

相关文章:

java - 设置安卓 :windowIsFloating programmatically

java - XMLunit 仅比较标签

swift - 错误: Instagram: Redirect URI does not match registered URI

function - Swift 不接受文本属性?

ios - 如何在 swift 4 中将 ASCII 码序列转换为字符串?

ios - 我如何为血糖值的 mmol/L(毫摩尔每升)构建 HealthKit HKUnit?

ios - 如何将 UITextField 添加到 CALayer 并使其工作

java - 简单 XML 解析 RSS 提要,其中包含声明两次的 2

ios - 测试 Xcode 项目时无法访问 AppDelegate

ios - MPRemoteCommandCenter 禁用所有控件