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