【问题标题】:Can't load xml data in container view无法在容器视图中加载 xml 数据
【发布时间】:2018-02-03 18:32:33
【问题描述】:

我正在尝试使用 XMLParser 解析 XML url。这是示例文件:

<itemlist>
<item name="Wave" id="1345" working="YES" extra="abcdef"/>
<item name="SCOOP" id="7585" working="YES" extra="sdgsdga"/>
<item name="Alpha" id="3983" working="NO" extra="jkbk"/>
<item name="panda" id="0237" working="YES" extra="adjkbvd"/>
<item name="ANT" id="7483" working="NO" extra="lnvdnlvs"/>
<item name="Wave!" id="9283" working="YES" extra="hiofenl"/>
<item name="o8" id="9473" working="NO" extra="lacknl"/>
<item name="Enjoy" id="8503" working="NO" extra="dnlk"/>
<item name="89" id="8383" working="YES" extra="nklvdnl"/>
<item name="Hub" id="0023" working="NO" extra="vdnlk"/>
</itemlist>

我能够解析 XML 文件并可以在控制台中看到数据,但容器视图上只加载了一个单元格。这是我的代码:

func beginParsing() {

    guard let url = URL(string: "http://example.com/") else { return }

    let parser = XMLParser(contentsOf: url)
    parser?.delegate = self
    parser?.parse()
    self.collectionView?.reloadData()
}

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

    self.items = [Items]()

    if elementName == "item" {
        let item = Items()
        if let name = attributeDict["name"] {
            item.nameLabel = name
            print(item)
        }
        if let itemWorking = attributeDict["working"] {
            item.itemWorkingLabel = itemWorking
            print(itemWorking)
        }
        if let itemId = attributeDict["id"] {
            item.idLabel = itemId
            print(itemId)
        }
        if let itemExtra = attributeDict["extra"] {
            item.extraLabel = itemExtra
            print(itemExtra)
        }

        self.items?.append(item)
    }
}

func parser(_ parser: XMLParser, foundCharacters string: String) {
    self.foundCharacters += string
}

func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    if elementName == "item" {
        let item1 = Item()
        self.items?.append(item1)
        self.items?.removeLast()
    }
    self.foundCharacters = ""
}

func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
    print("failure: ", parseError)
}

这是模拟器显示的内容: simulator

我该如何解决?谢谢。

【问题讨论】:

    标签: ios xml swift xml-parsing iteration


    【解决方案1】:

    您的问题是在每个解析的元素上重新初始化 self.items = [Items]()(在 didStartElement 上)。

    另外,您正在下一行删除刚刚添加的项目:

        self.items?.append(item1)
        self.items?.removeLast()
    

    【讨论】:

    • 删除 .removeLast() 只是在容器视图中添加一个空白单元格。
    • 因为 let item1 = Item() 没有定义的字段。您只需将空项目添加到 self.items
    • 那我该如何解决呢?我必须像这样添加所有单元格吗?
    • 每次检测到新的解析元素时都会调用func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { 行。在此函数中,您创建新的[Items] 数组并将其分配给变量self.item。因此,当解析完成时,您将只有数组中的最后一个元素。您应该将self.items = [Items]() 移出范围。
    • 好的,谢谢。我试过了,但是从didStartElement 中删除self.items = [Items]() 后,它只显示一个没有单元格的空白视图。
    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2014-08-25
    • 2010-11-21
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多