NSXML 使用 Swift 将损坏的字符串解析为数组
NSXMLParsing broken strings into an array using Swift
使用 NSXMLParser,在下面的代码中 conditionIconString = conditionIconString + string
将 link 存储到 1 个大字符串中,但我需要它将每个 link 作为字符串存储在 [=14= 中].我不知道该怎么做?
var conditionsIcons = [String]()
var conditionIconString = String()
var weAreInsideAnItem = false
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
if (elementName as NSString).isEqualToString("icon-link") {
weAreInsideAnItem = true
}
if (elementName as NSString).isEqualToString("conditions-icon") {
conditionsIcons = [String]()
conditionsIcons = [""]
}
func parser(parser: NSXMLParser, foundCharacters string: String) {
if weAreInsideAnItem == true {
if element.isEqualToString("icon-link") {
conditionIconString = conditionIconString + string
}
}
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if (elementName as NSString).isEqualToString("icon-link") {
conditionsIcons.append(conditionIconString)
weAreInsideAnItem = false
}
elements.setObject(conditionsIcons, forKey: "conditionIcons")
}
这是我正在解析的XML
:http://forecast.weather.gov/MapClick.php?lat=39.557&lon=-79.3542&unit=0&lg=english&FcstType=dwml
<conditions-icon type="forecast-NWS" time-layout="k-p12h-n13-1">
<name>Conditions Icon</name>
<icon-link>
http://forecast.weather.gov/newimages/medium/wind_sct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/DualImage.php?i=nra_sn&j=nsn&ip=20&jp=40
</icon-link>
<icon-link>
http://forecast.weather.gov/DualImage.php?i=sn&j=bkn&ip=20
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/nsct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/sct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/nsct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/sct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/nsct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/bkn.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/nbkn.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/bkn.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/nshra40.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/bkn.png
</icon-link>
</conditions-icon>
问题是 conditionIconString
永远不会重置,它会随着找到的每个 <icon-link>
标签而增长。在开始解析下一个元素之前更新 didEndElement
函数以将此字符串设置回空:
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if (elementName as NSString).isEqualToString("icon-link") {
conditionsIcons.append(conditionIconString)
conditionIconString = String() // THIS IS THE KEY LINE
weAreInsideAnItem = false
}
elements.setObject(conditionsIcons, forKey: "conditionIcons")
}
看来您需要在 parser:didEndElement:namespaceURI:qualifiedName:
中重置 conditionIconString
。在 "weAreInsideAnItem = false":
这行之前添加
conditionIconString = String()
使用 NSXMLParser,在下面的代码中 conditionIconString = conditionIconString + string
将 link 存储到 1 个大字符串中,但我需要它将每个 link 作为字符串存储在 [=14= 中].我不知道该怎么做?
var conditionsIcons = [String]()
var conditionIconString = String()
var weAreInsideAnItem = false
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
if (elementName as NSString).isEqualToString("icon-link") {
weAreInsideAnItem = true
}
if (elementName as NSString).isEqualToString("conditions-icon") {
conditionsIcons = [String]()
conditionsIcons = [""]
}
func parser(parser: NSXMLParser, foundCharacters string: String) {
if weAreInsideAnItem == true {
if element.isEqualToString("icon-link") {
conditionIconString = conditionIconString + string
}
}
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if (elementName as NSString).isEqualToString("icon-link") {
conditionsIcons.append(conditionIconString)
weAreInsideAnItem = false
}
elements.setObject(conditionsIcons, forKey: "conditionIcons")
}
这是我正在解析的XML
:http://forecast.weather.gov/MapClick.php?lat=39.557&lon=-79.3542&unit=0&lg=english&FcstType=dwml
<conditions-icon type="forecast-NWS" time-layout="k-p12h-n13-1">
<name>Conditions Icon</name>
<icon-link>
http://forecast.weather.gov/newimages/medium/wind_sct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/DualImage.php?i=nra_sn&j=nsn&ip=20&jp=40
</icon-link>
<icon-link>
http://forecast.weather.gov/DualImage.php?i=sn&j=bkn&ip=20
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/nsct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/sct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/nsct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/sct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/nsct.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/bkn.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/nbkn.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/bkn.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/nshra40.png
</icon-link>
<icon-link>
http://forecast.weather.gov/newimages/medium/bkn.png
</icon-link>
</conditions-icon>
问题是 conditionIconString
永远不会重置,它会随着找到的每个 <icon-link>
标签而增长。在开始解析下一个元素之前更新 didEndElement
函数以将此字符串设置回空:
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if (elementName as NSString).isEqualToString("icon-link") {
conditionsIcons.append(conditionIconString)
conditionIconString = String() // THIS IS THE KEY LINE
weAreInsideAnItem = false
}
elements.setObject(conditionsIcons, forKey: "conditionIcons")
}
看来您需要在 parser:didEndElement:namespaceURI:qualifiedName:
中重置 conditionIconString
。在 "weAreInsideAnItem = false":
conditionIconString = String()