从XML数据中的字符串创建类别

时间:2017-12-07 21:54:12

标签: ios swift xml

我到处寻找,但我没有看到任何特定于我想要实现的东西,尤其是iOS / swift。我想从我在我的应用程序中调用的XML解析器请求中创建年龄类别。

必须从xml数据中的标记调用年龄信息:

<item>
<description>ANTHONY JOHNSON, Age: 17 From: PEORIA, IL</description></item>

我已经打电话来完整地获取描述标签:

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

 if elementName == "description" {
        self.person.desc = self.foundCharacters; }

     if elementName == "item" {
tempData.desc = self.person.desc; }

项目类:

 class Item { 
  var desc = "";
}

我只需要从年龄值开始制作类别。我计划将它们与enum一起使用:

enum ageCategories: String {

    case ageUnder10 = "Age 10 and under"
    case age10Plus = "Age 10-15"
    case age15Plus = "Age 15+"
}

我的问题是:

  • 我是否可以在XML解析器中拨打电话来获取年龄?我如何组织调用以仅获取描述字符串的年龄部分并将它们分类?

OR

  • 是否有一种更简单的方法可以从我在XML解析器中调用的字符串中调用年龄,然后使用该字符串创建类别?即:replacementOccurrences(范围searchRange:“年龄”)

1 个答案:

答案 0 :(得分:1)

您的问题归结为在描述字符串中查找年龄。以下显示了使用Scanner的一种解决方案。此代码假定年龄将是文本“年龄:”之后的数字。

let desc = "ANTHONY JOHNSON, Age: 17 From: PEORIA, IL"
var ageRange: ageCategories? = nil

let scanner = Scanner(string: desc)
if scanner.scanUpTo("Age:", into: nil) && scanner.scanString("Age:", into: nil) {
    var age = 0
    if scanner.scanInt(&age) {
        switch age {
        case 0..<10:
            ageRange = .AgeUnder10
        case 10..<15:
            ageRange = .Age10Plus
        case 15...:
            ageRange = .Age15Plus
        default:
            break
        }
    }
}

if let ageRange = ageRange {
    print("Found age range of \(ageRange)")
} else {
    print("No valid age found")
}

调整case语句中的范围以符合您的实际需要。您为枚举值指定的字符串不明确。 10应该是.AgeUnder10还是.Age10Plus

FYI - 枚举值应以小写字母开头,枚举名称应以大写字母开头。所以你的枚举应该是:

enum AgeCategories: String {
    case ageUnder10 = "Age under 10"
    case age10Plus = "Age 10-14"
    case age15Plus = "Age 15+"
}