Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML解析器读取通道描述标记_Xml_Swift_Rss - Fatal编程技术网

XML解析器读取通道描述标记

XML解析器读取通道描述标记,xml,swift,rss,Xml,Swift,Rss,我有一个xml解析器,可以解析sharontalon.com/feed的提要 但是,当字符串放入表中时,提要的描述将用作第一个项目描述,将所有post描述向下碰撞到一个项目。如何跳过第一个描述标记 这是XMLParser 导入UIKit @objc协议XMLParserDelegate{ func parsingwasfished() } 类XMLParser:NSObject,NSXMLParserDelegate{ var arrpasseddata=[Dictionary]() var

我有一个xml解析器,可以解析sharontalon.com/feed的提要 但是,当字符串放入表中时,提要的描述将用作第一个项目描述,将所有post描述向下碰撞到一个项目。如何跳过第一个描述标记

这是XMLParser

导入UIKit
@objc协议XMLParserDelegate{
func parsingwasfished()
}
类XMLParser:NSObject,NSXMLParserDelegate{
var arrpasseddata=[Dictionary]()
var currentDataDictionary=字典()
var currentElement=“”
var foundCharacters=“”
变量委托:XMLParserDelegate?
func StartPassingwithContentsOfURL(rssURL:NSURL){
let parser=NSXMLParser(contentsofull:rssURL)
解析器!.delegate=self
语法分析器!.parse()
}
func parserDidEndDocument(解析器:NSXMLParser){
委托人?.parsingwassfinished()
}
func解析器(解析器:NSXMLParser,didStartElement元素名称:String!,namespaceURI:String!,qualifiedName qName:String!,attributes attributeDict:[String:String]){
currentElement=elementName
}
func解析器(解析器:NSXMLParser,didEndElement元素名称:String!,namespaceURI:String!,qualifiedName qName:String!){
if!foundCharacters.isEmpty{
如果elementName==“link”| | elementName==“description”{
foundCharacters=(作为NSString的foundCharacters)。substringFromIndex(3)
}
currentDataDictionary[currentElement]=foundCharacters
foundCharacters=“”
如果currentElement==“pubDate”{
arrpasseddata.append(currentDataDictionary)
}
}
}
func解析器(解析器:NSXMLParser,foundCharacters string:string!){
如果(currentElement==“title”)| | currentElement==“description”| | currentElement==“link”| | currentElement==“pubDate”{
foundCharacters+=字符串
}
}
func解析器(解析器:NSXMLParser,parseError发生parseError:NSError!){
打印(parseError.description)
}
func解析器(解析器:NSXMLParser,validationerrorocurred validationError:NSError!){
打印(验证错误说明)
}

}
发生此问题的原因是,在XML数据中,
cannel
标记内有一个
说明
标记,当到达
pubDate
标记时,您正在将数据插入
arrParsedData
字典,该标记位于下一个
说明
标记之前,您运气不好,因为
频道
标记已经包含
描述
标记,因此您没有感觉到错误。但如果没有,就会发生异常,告诉您没有名为
description
的标记。我改变了你的状况

 if currentElement == "pubDate"
致:

我添加了
isFirst
变量,以避免
channel
标记下的第一个
description
标记。另请参阅我添加的
其他部分

if currentElement == "description" && !isFirst

        {
            arrParsedData.append(currentDataDictionary)   
        }else {
            if currentElement == "description" && isFirst {
                isFirst = false
            }
        }
这是结果的屏幕截图:

这是新的
XMLParserDelegate
。我还更正了
NSXMLParserDelegate
方法的一些签名

 import UIKit

 @objc protocol XMLParserDelegate{

    func parsingWasFinished()

 }

 class XMLParser: NSObject, NSXMLParserDelegate {
    var arrParsedData = [Dictionary<String, String>]()
    var currentDataDictionary = Dictionary<String, String>()
    var currentElement = ""
    var foundCharacters = ""
    var delegate : XMLParserDelegate?
    var isFirst = true
    func startParsingWithContentsOfURL(rssURL: NSURL) {

        let parser = NSXMLParser(contentsOfURL: rssURL)

        parser!.delegate = self

        parser!.parse()

    }


    func parserDidEndDocument(parser: NSXMLParser) {

        delegate?.parsingWasFinished()

    }

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

    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {


            if !foundCharacters.isEmpty {
                if elementName == "link" || elementName == "description" {
                    foundCharacters = (foundCharacters as NSString).substringFromIndex(3)
                }
                currentDataDictionary[currentElement] = foundCharacters

                foundCharacters = ""

                if currentElement == "description" && !isFirst

                {
                    arrParsedData.append(currentDataDictionary)
                }else {
                    if currentElement == "description" && isFirst {
                        isFirst = false
                    }
                }
            }

    }

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

        if currentElement == "title"  || currentElement == "description"
            || currentElement == "link" || currentElement == "pubDate"
        {

            foundCharacters += string

        }

    }

    func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {

        print(parseError.description)

    }

    func parser(parser: NSXMLParser, validationErrorOccurred validationError: NSError) {

        print(validationError.description)

    }

 }
导入UIKit
@objc协议XMLParserDelegate{
func parsingwasfished()
}
类XMLParser:NSObject,NSXMLParserDelegate{
var arrpasseddata=[Dictionary]()
var currentDataDictionary=字典()
var currentElement=“”
var foundCharacters=“”
变量委托:XMLParserDelegate?
var isFirst=true
func StartPassingwithContentsOfURL(rssURL:NSURL){
let parser=NSXMLParser(contentsofull:rssURL)
解析器!.delegate=self
语法分析器!.parse()
}
func parserDidEndDocument(解析器:NSXMLParser){
委托人?.parsingwassfinished()
}
func解析器(解析器:NSXMLParser,didStartElement元素名称:String,namespaceURI:String?,qualifiedName qName:String?,attributes attributeDict:[String:String]){
currentElement=elementName
}
func解析器(解析器:NSXMLParser,didEndElement元素名称:String,namespaceURI:String?,qualifiedName qName:String?){
if!foundCharacters.isEmpty{
如果elementName==“link”| | elementName==“description”{
foundCharacters=(作为NSString的foundCharacters)。substringFromIndex(3)
}
currentDataDictionary[currentElement]=foundCharacters
foundCharacters=“”
如果currentElement==“description”&&&!isFirst
{
arrpasseddata.append(currentDataDictionary)
}否则{
如果currentElement==“描述”&&isFirst{
isFirst=false
}
}
}
}
func解析器(解析器:NSXMLParser,foundCharacters string:string){
如果currentElement==“title”| | currentElement==“description”
||currentElement==“链接”| | currentElement==“发布日期”
{
foundCharacters+=字符串
}
}
func语法分析器(语法分析器:NSXMLParser,parseError发生语法错误:NSError){
打印(parseError.description)
}
func解析器(解析器:NSXMLParser,validationerrorocurred validationError:NSError){
打印(验证错误说明)
}
}

我不知道你的问题是什么。我尝试了你的代码,那么你的问题又是什么呢?我现在明白了,标题和描述之间总是有一个变化。让我试着帮你我写了一个答案:)
 import UIKit

 @objc protocol XMLParserDelegate{

    func parsingWasFinished()

 }

 class XMLParser: NSObject, NSXMLParserDelegate {
    var arrParsedData = [Dictionary<String, String>]()
    var currentDataDictionary = Dictionary<String, String>()
    var currentElement = ""
    var foundCharacters = ""
    var delegate : XMLParserDelegate?
    var isFirst = true
    func startParsingWithContentsOfURL(rssURL: NSURL) {

        let parser = NSXMLParser(contentsOfURL: rssURL)

        parser!.delegate = self

        parser!.parse()

    }


    func parserDidEndDocument(parser: NSXMLParser) {

        delegate?.parsingWasFinished()

    }

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

    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {


            if !foundCharacters.isEmpty {
                if elementName == "link" || elementName == "description" {
                    foundCharacters = (foundCharacters as NSString).substringFromIndex(3)
                }
                currentDataDictionary[currentElement] = foundCharacters

                foundCharacters = ""

                if currentElement == "description" && !isFirst

                {
                    arrParsedData.append(currentDataDictionary)
                }else {
                    if currentElement == "description" && isFirst {
                        isFirst = false
                    }
                }
            }

    }

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

        if currentElement == "title"  || currentElement == "description"
            || currentElement == "link" || currentElement == "pubDate"
        {

            foundCharacters += string

        }

    }

    func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {

        print(parseError.description)

    }

    func parser(parser: NSXMLParser, validationErrorOccurred validationError: NSError) {

        print(validationError.description)

    }

 }