SwiftのXMLParserでbackspaceを削除する方法

スポンサーリンク
プログラミング
スポンサーリンク

XMLParserを使ってXMLを取得する

SwiftでXMLを取得してくるには、以下のようにやります。

let xp = XMLParser(contentsOf: URL(string: "https://nozograph.com/feed/")!)
xp.parse()

ですが時々`backspace` などの文字が入ってきてうまくパースできない時があります。

backspaceを削除する

手順としては

  1. HTTP Requestを送り、XMLのデータを取得する
  2. 文字列処理でbackspaceを削除する
  3. XMLParserに読み込ませる

といった手順てやります。

実装

   

let request = URLRequest(
url: url,
cachePolicy: .reloadIgnoringLocalCacheData
)
let session = URLSession.shared
var xmlData = ""
let sem = DispatchSemaphore(value:0)
session.dataTask(with: request) { (data, response, error) in
if error == nil, let data = data, let _ = response as? HTTPURLResponse {
xmlData = (String(data: data, encoding: String.Encoding.utf8) ?? "").replacingOccurrences(of:"\u{8}", with:"")
sem.signal()
}
}.resume()
sem.wait()

guard let dat = xmlData.data(using: String.Encoding.utf8) else {
    fatalError()
}
let xp = XMLParser(data: dat)
xp.parse()

 

解説

Cacheを無効にしたHTTPのGETリクエストを投げます。   

let request = URLRequest(
url: url,
cachePolicy: .relouadIgnoringLocalCacheData
)

取得してきた値からbackspaceだけreplaceします。
ユニコードを指定してあげることができるのでbackspaceの場合\u{8}です。

replacingOccurrences(of:"\u{8}", with:"")

replaceしたテキストをUTF8に変換して、XMLParserにURLではなく、データとして渡します。

 

guard let dat = xmlData.data(using: String.Encoding.utf8) else {
fatalError()
}
let xp = XMLParser(data: dat)

これでうまくできると思います。

また他の文字が入ってしまった場合などにもこの方法で削除することができます。

コメント

タイトルとURLをコピーしました