👏

SwiftでXMLをパースする際のXMLparserの流れ

2021/12/08に公開

タグ内のデータ、特に文字列をパースする際の流れです。

XMLをパースする際、SwiftではXMLparserというクラスを利用することができます。
その場合は、

XMLParserDelegate

に準拠する必要があります。

その上で、各メソッドを実装していきます。
実行するのはXMLparserクラスであり、そのためのインスタンスを作った上で実行する必要があります。

var parser:XMLParser!

if let url = URL(string:url){
    if let parser = XMLParser(contentsOf: url) {
	self.parser = parser
	self.parser.delegate = self
	self.parser.parse()
    }
}

URLクラスで指定された先を取得した上で、XMLparser型の変数にインスタンスを作ります。また、そのdelegate先は、XMLParserDelegateプロトコルに準拠したクラスなどを指定します。ここでは、ViewControllerを想定して、selfとしています。ここでようやく本来求めているパースを行う、.parse()が実行できます。

実行後は次の順序で、parse()の一連のメソッドが走ります。

   
func parserDidStartDocument(_ parser: XMLParser) {
   //XMLのパースの開始で呼ばれるメソッド
}

func parser(_ parser: XMLParser,
            didStartElement elementName: String,
            namespaceURI: String?,
            qualifiedName qName: String?,
            attributes attributeDict: [String : String]) {
    //XML中のタグの開始時に呼ばれる
}

func parser(_ parser:XMLParser,foundCharacters string:String){
    //タグ中のデータに対して呼ばれるメソッド
}

func parser(_ parser:XMLParser,
            didEndElement elementName:String,
            namespaceURI:String?,
            qualifiedName qName:String?){
    //XML中のタグの終了時に対して呼ばれる

}

func parserDidEndDocument(_ parser:XMLParser){
    //XMLのパースの終了に呼ばれるメソッド
}

ただし、それぞれはOptionalであって、プロトコルに準拠していても実装が必須というわけではありません。また.parse()の終了は解析の終了時であるため、

self.parser.parse()
print(.parse()の終了後に呼ばれる”)

とした場合、print文は.parse()が終了するまでは呼ばれません。

parserDidStartDocument(_:)
https://developer.apple.com/documentation/foundation/xmlparserdelegate/1412065-parserdidstartdocument

parser(_:didStartElement:namespaceURI:qualifiedName:attributes:)
https://developer.apple.com/documentation/foundation/xmlparserdelegate/1415894-parser

parser(_:foundCharacters:)
https://developer.apple.com/documentation/foundation/xmlparserdelegate/1412539-parser

parser(_:didEndElement:namespaceURI:qualifiedName:)
https://developer.apple.com/documentation/foundation/xmlparserdelegate/1417955-parser

parserDidEndDocument(_:)
https://developer.apple.com/documentation/foundation/xmlparserdelegate/1418172-parserdidenddocument

Discussion