2

我尝试SWXMLHash并模拟从网站下载进行解析,我在操场上创建了一个包含数据的文件。我得到了这个,因为来自URLSessionManagerData 的响应看起来类似于:

3c3f786d 6c207665 7273696f 6e3d2731 ...

但当然要长得多。

我是这样读的:

guard let fileURL = Bundle.main.url(forResource: "xmlData", withExtension: "")
    else { fatalError("cannot load file")}
do {
    let xmlData = try Data(contentsOf: fileURL, options: .mappedIfSafe)
} catch {
    print(error)
}

我认为这行得通,没有错误,如果我打印它返回的数据169735 bytes

然后我尝试解析它(在do块内):

let xml = SWXMLHash.parse(xmlData)
print(xml)

这返回\n,所以没有输出。

SWXMLHash提供一个接受Data对象的方法。我怎样才能让它工作?

4

1 回答 1

2

根据SWXMLHash

public func parse(_ xml: String) -> XMLIndexer {
    guard let data = xml.data(using: options.encoding) else {
        return .xmlError(.encoding)
    }
    return parse(data)
}

public func parse(_ data: Data) -> XMLIndexer {
    let parser: SimpleXmlParser = options.shouldProcessLazily
        ? LazyXMLParser(options)
        : FullXMLParser(options)
    return parser.parse(data)
}

虽然您提供一个String或一个Data对象,但如果需要,它会在内部解析一个Data进行转换的对象。这是一种安全的编码方式,这样所有初始化方法都通过相同的方法,并修复它修复所有不同的初始化。

所以它应该工作。

您的问题是您的文件是 HexData 的字符串表示形式,而不是 RawHexData 文件。
解决方案是将 XML 字符串放入该文件中。

会将该Data(contentsOf: fileURL, options: .mappedIfSafe)XML 字符串转换为它的十六进制表示。然后它将起作用。

于 2018-04-25T21:07:39.217 回答