gpt4 book ai didi

swift - 如何解决 ios swift 中的 XMLParser.ErrorCode.invalidCharacterError ?

转载 作者:行者123 更新时间:2023-11-30 11:07:57 25 4
gpt4 key购买 nike

我有一项作业需要阅读一些 RSS 提要并建立用户个人资料等。

我的问题是当我使用 Foundation 的 XMLParser 时,我会遇到“操作无法完成。(NSXMLParserErrorDomain 错误 9。)”

我检查了文档,似乎有 invalidCharacterError。我不认为我的代码有问题,因为它适用于另一个网址提要。那么我应该怎么做才能克服这个问题呢?

这是网址:http://halley.exp.sis.pitt.edu/comet/utils/_rss.jsp?v=bookmark&user_id=3600

附注此提要包含 CDATA,因此我注释掉了标题和描述,但它应该显示日期,但它仍然显示该错误。所以我担心的是,在解析 xml 的过程中,它遇到了任何无效字符并报告错误。无论如何要修复它吗?不过我必须使用这个网址。

一些相关代码在这里:

func parseFeed(url: String, completionHandler: (([RSSItem]) -> Void)?)
{
self.parserCompletionHandler = completionHandler

let request = URLRequest(url: URL(string: url)!)
let urlSession = URLSession.shared
let task = urlSession.dataTask(with: request) { (data, response, error) in
guard let data = data else {
if let error = error {
print(error.localizedDescription)
}

return
}

/// parse our xml data
let parser = XMLParser(data: data)
parser.delegate = self
parser.parse()
}

task.resume()
}

// MARK: - XML Parser Delegate

func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:])
{
currentElement = elementName
if currentElement == "item" {
currentTitle = ""
currentDescription = ""
currentPubDate = ""
}
}

func parser(_ parser: XMLParser, foundCharacters string: String)
{
switch currentElement {
// case "title": currentTitle += string
// case "description" : currentDescription += string
case "pubDate" : currentPubDate += string
default: break
}
}

func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)
{
if elementName == "item" {
let rssItem = RSSItem(title: currentTitle, description: currentDescription, pubDate: currentPubDate)
self.rssItems.append(rssItem)
}
}

func parserDidEndDocument(_ parser: XMLParser) {
parserCompletionHandler?(rssItems)
}

func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error)
{
print(parseError.localizedDescription)
}

最佳答案

我在您显示的 URL 的响应中的 CDATA 元素之一内发现了无效字节 0xFC。

在声明 encoding="UTF-8" 的文档中,这作为 UTF-8 字节是无效的。

您最好告诉 URL 的服务器工程师,RSS 提要的 XML 无效。

如果您需要使用这种格式错误的 XML,则需要将其转换为有效的 UTF-8 数据。

0xFC 代表 ISO-LATIN-1 中的 ü,因此您可以编写类似这样的内容。

func parseFeed(url: String, completionHandler: (([RSSItem]) -> Void)?)
{
self.parserCompletionHandler = completionHandler

let request = URLRequest(url: URL(string: url)!)
let urlSession = URLSession.shared
let task = urlSession.dataTask(with: request) { (data, response, error) in
guard var data = data else { //###<-- `var` here
if let error = error {
print(error.localizedDescription)
}

return
}

//### When the input `data` cannot be decoded as a UTF-8 String,
if String(data: data, encoding: .utf8) == nil {
//Interpret the data as an ISO-LATIN-1 String,
let isoLatin1 = String(data: data, encoding: .isoLatin1)!
//And re-encode it as a valid UTF-8
data = isoLatin1.data(using: .utf8)!
}

/// parse our xml data
let parser = XMLParser(data: data)
parser.delegate = self
parser.parse()
}

task.resume()
}

如果您需要使用其他编码,问题会更加困难,因为很难正确估计文本编码。

<小时/>

您可能需要实现func parser(_ parser: XMLParser,foundCDATA CDATABlock: Data),但这似乎是另一个问题。

关于swift - 如何解决 ios swift 中的 XMLParser.ErrorCode.invalidCharacterError ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52489760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com