#Fuzi
私が作ったXML/HTML パーサーFuziがSwiftSandbox Issue 9に当選しましたw
Update: 2016/09/24, FuziがFirefox for iOSプロジェクトに採用されました
Fuzi は Mattt Thompson氏の Ono(斧) に参照し Swift 言語で実装した XML/HTML パーサーです。[ドキュメント]
よろしければ、どうぞお使いくださ(CocoaPods, Carthage対応あり)
日本語のREADMEもあります https://github.com/cezheng/Fuzi/blob/master/README-ja.md
#用例
##XML
import Fuzi
let xml = "..."
do {
// if encoding is omitted, it defaults to NSUTF8StringEncoding
let doc = try XMLDocument(string: xml, encoding: NSUTF8StringEncoding)
if let root = document.root {
print(root.tag)
// define a prefix for a namespace
document.definePrefix("atom", defaultNamespace: "http://www.w3.org/2005/Atom")
// get first child element with given tag in namespace(optional)
print(root.firstChild(tag: "title", inNamespace: "atom")
// iterate through all children
for element in root.children {
print("\(index) \(element.tag): \(element.attributes)")
}
}
// you can also use CSS selector against XMLDocument when you feels it makes sense
} catch let error as XMLError {
switch error {
case .NoError: print("wth this should not appear")
case .ParserFailure, .InvalidData: print(error)
case .LibXMLError(let code, let message):
print("libxml error code: \(code), message: \(message)")
}
}
##HTML
HTMLDocument
は XMLDocument
サブクラス。
import Fuzi
let html = "<html>...</html>"
do {
// if encoding is omitted, it defaults to NSUTF8StringEncoding
let doc = try HTMLDocument(string: html, encoding: NSUTF8StringEncoding)
// CSS queries
if let elementById = doc.css("#id") {
print(elementById.stringValue)
}
for link in doc.css("a, link") {
print(link.rawXML)
print(link["href"]
}
// XPath queries
if let title = doc.firstChild(xpath: "//head/title") {
print(title.stringValue)
}
for paragraph in doc.xpath(".//body/descendant::p") {
print(meta["class"])
}
// Evaluate XPath functions
if let result = doc.eval(xpath: "count(/*/a)") {
print("anchor count : \(result.doubleValue)")
}
} catch let error {
print(error)
}
##エラー処理なんて、どうでもいい場合
import Fuzi
let xml = "..."
// Don't show me the errors, just don't crash
if let doc1 = try? XMLDocument(string: xml) {
//...
}
let html = "<html>...</html>"
// I'm sure this won't crash
let doc2 = try! HTMLDocument(string: html)
//...
#Onoからの移行?
下記2つのサンプルコードを見たら、Ono
とFuzi
の違いをわかる。
もっと詳しい情報はgithubのREADMEをご覧ください。