我从需要存储的 xml 中获取了 3 层数据
1:开始时间和结束时间
2:主机的IP和MAC地址
3:各主机IP的端口号和服务
我用来解决这个问题的方法是创建 3 个类,并让每个类都有数据变量,如下所示:
class Ports {
var scanPortNumber: [String] = [""]
var scanProtocol: [String] = [""]
}
class Hosts {
var hostPorts = [Ports]()
var scanHostIP: [String] = [""]
var scanHostMacAddr: [String] = [""]
}
class Scan {
var scanHosts = [Hosts]()
var scanStartTime: [String] = [""]
var scanEndTime: [String] = [""]
}
然后我声明了一个全局对象,我在其中解析 xml,如下所示:
var scanDetails = Scan()
这样我就可以像这样存储从 xml 获得的 IP:
scanDetails.scanHosts[i].scanHostIP[i] = "the IP I get from parsing the xml"
这是我尝试存储数据的方式:
var scanDetails = Scan()
class XMLRead: NSObject, XMLParserDelegate {
var hostIP = ""
var hostMacAddr = ""
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
var i = 0
if !elementName.isEmpty {
switch elementName {
case "address":
print("i in address = \(i)")
let addrType = attributeDict["addrtype"]
if addrType == "ipv4" {
let hostIPtmp = attributeDict["addr"]
if hostIPtmp != hostIP || hostIP == "" {
hostIP = hostIPtmp!
scanDetails.scanHosts[i].scanHostIP[i] = hostIP
}
}
else if addrType == "mac" {
let hostMacAddrtmp = attributeDict["addr"]
if hostMacAddrtmp != hostMacAddr || hostMacAddr == "" {
hostMacAddr = hostMacAddrtmp!
scanDetails.scanHosts[i].scanHostMacAddr[i] = hostMacAddr
}
}
print("hostIP = \(scanDetails.scanHosts[i].scanHostIP[i])")
print("hostMacAddr = \(scanDetails.scanHosts[i].scanHostMacAddr[i])")
default: break
}
i += 1
print("i = \(i)")
}
}
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
print("failure error: \(parseError)")
}
}
但是这个方法似乎不起作用,因为当我这样做时它给了我**索引超出范围错误**
。所以我尝试使用 append()
方法,但它说我必须附加一个 Hosts
类型,并且不允许我附加从 xml 获取的值,因为它是一个字符串。
我对 swift 还很陌生,所以如果有人能告诉我我做错了什么以及如何解决它,我将不胜感激。
最佳答案
只需运行您提供的代码: 我将进行以下更改:
.
.
var i = 0
var host: Hosts?
.
.
if hostIPtmp != hostIP || hostIP == "" {
hostIP = hostIPtmp!
host = Hosts()
host!.scanHostIP.append(hostIP)
scanDetails.scanHosts.append(host!)
}
.
.
.
if hostMacAddrtmp != hostMacAddr || hostMacAddr == "" {
hostMacAddr = hostMacAddrtmp!
if host == nil {
host = Hosts()
}
host!.scanHostMacAddr.append(hostMacAddr)
scanDetails.scanHosts.append(host!)
}
.
.
但我不明白,如果您只想在每个类中放入一个值,为什么要使用“i”和类的变量作为数组。
关于Swift:如何将数据添加到对象列表中对象的变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65991782/