新年明けましておめでとうございます
- 目的
住所録とかのXMLファイルを読み込んだ場合に番地とかの半角と全角の混ざっている「1丁目136番地」と混ざってない「1丁目136番地」では読み取りでそのままの「1丁目136番地」になりますが ? 半角と全角の「1丁目136番地」では「1」と「丁目136番地」と2つに分割されて読み込まれますよね ?
では、XMLファイルのそれぞれのコードです
全てが全角
XML全て全角.xml.swift
<!-- 番地 -->
<AddressLine addressLineType="Number">1丁目136番地</AddressLine>
半角と全角が混ざっている
XML半角と全角.xml.swift
<!-- 番地 -->
<AddressLine addressLineType="Number">1丁目136番地</AddressLine>
例えばsample.xmlとかでバンドルしてください、2つのコードは一緒に同一ファイル内に同居するとエラーになりますよ
Swiftコードです
ViewController.swift
//
// ViewController.swift
// NSXMLParser
//
// Created by 福田敏一 on 2019/01/07.
// Copyright © 2019 福田敏一. All rights reserved.
//
import UIKit
class ViewController: UIViewController , XMLParserDelegate {
var parsedStringArray:Array<String>!
var stringArray = ["stringArray"]
var stringMix = ["stringMix"]
var parsedStringArrayCount = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
loadXMLFileFromBundle()
}
func loadXMLFileFromBundle() {
//バンドルからXMLを読み込む
guard let path = Bundle.main.path(forResource: "sample", ofType: "xml") else { return }
let url: NSURL? = NSURL(fileURLWithPath: path as String)
let parser: XMLParser? = XMLParser(contentsOf: url! as URL)
if parser != nil {
parser!.delegate = self
parser!.parse()
//確認出力
print("parser!出力")
print(parser!)
print("パース成功")
}else{
print("パース失敗")
}
}
//Parse関連処理
func parserDidStartDocument(_ parser: XMLParser){
print("XML解析開始しました")
}
//開始タグを読み込んだ時よばれる
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
//配列初期化
parsedStringArray = []
print("開始タグ:" + elementName)
}
//タグ以外のテキストを読み込んだ時(タグとタグ間の文字列)
func parser(_ parser: XMLParser, foundCharacters string: String) {
print("0通過・string -> \(string)")
parsedStringArray.append(string)
print("1通過・parsedStringArray -> \(parsedStringArray!)")
if parsedStringArray.count == 2 {
parsedStringArrayCount = parsedStringArray.count
print("2通過・stringArray.count -> \(stringArray.count)")
print("3通過・stringArray -> \(stringArray)")
stringMix += parsedStringArray
print("4通過・stringMix -> \(stringMix)")
let 番地結合 = stringMix[1] + stringMix[2]
print("5通過・番地結合 -> \(番地結合)")
parsedStringArray.append(番地結合)
print("6通過・stringArray -> \(stringArray)")
print("7通過・parsedStrArr.count -> \(parsedStringArray.count)")
print("00通過・parsedStringArray -> \(parsedStringArray!)")
parsedStringArray.remove(at: parsedStringArray.count - 2)
print("01通過・parsedStringArray -> \(parsedStringArray!)")
parsedStringArray.remove(at: 0)
print("02通過・parsedStringArray -> \(parsedStringArray!)")
}
stringArray += parsedStringArray
print("8通過・stringArray -> \(stringArray)")
if parsedStringArrayCount == 2 {
print("9通過・stringArray.count -> \(stringArray.count)")
stringArray.remove(at: stringArray.count - 2)
print("10通過・stringArray -> \(stringArray)")
parsedStringArrayCount = 0
}
print("11通過・stringArray[1] -> \(stringArray[1])")
}
//閉じタグを読み込んだ時よばれる
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
print("終了タグ:" + elementName)
}
func parserDidEndDocument(_ parser: XMLParser){
//ここで最終処理
}
//解析中にエラーが発生した時に実行されるメソッド
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
print("エラー:" + parseError.localizedDescription)
}
}
//XMLファイル全角の場合「<AddressLine addressLineType="Number">1丁目136番地</AddressLine>」
//実行結果
/*
ML解析開始しました
開始タグ:AddressLine
0通過・string -> 1丁目136番地
1通過・parsedStringArray -> ["1丁目136番地"]
8通過・stringArray -> ["stringArray", "1丁目136番地"]
11通過・stringArray[1] -> 1丁目136番地
終了タグ:AddressLine
parser!出力
<NSXMLParser: 0x60000356ae20>
パース成功
*/
//XMLファイル半角と全角の場合「<AddressLine addressLineType="Number">1丁目136番地</AddressLine>」
//実行結果
/*
XML解析開始しました
開始タグ:AddressLine
0通過・string -> 1
1通過・parsedStringArray -> ["1"]
8通過・stringArray -> ["stringArray", "1"]
11通過・stringArray[1] -> 1
0通過・string -> 丁目136番地
1通過・parsedStringArray -> ["1", "丁目136番地"]
2通過・stringArray.count -> 2
3通過・stringArray -> ["stringArray", "1"]
4通過・stringMix -> ["stringMix", "1", "丁目136番地"]
5通過・番地結合 -> 1丁目136番地
6通過・stringArray -> ["stringArray", "1"]
7通過・parsedStrArr.count -> 3
00通過・parsedStringArray -> ["1", "丁目136番地", "1丁目136番地"]
01通過・parsedStringArray -> ["1", "1丁目136番地"]
02通過・parsedStringArray -> ["1丁目136番地"]
8通過・stringArray -> ["stringArray", "1", "1丁目136番地"]
9通過・stringArray.count -> 3
10通過・stringArray -> ["stringArray", "1丁目136番地"]
11通過・stringArray[1] -> 1丁目136番地
終了タグ:AddressLine
parser!出力
<NSXMLParser: 0x600002ad27f0>
パース成功
*/
- 感想
全角のみでは変換作業は行われていませんが ? 半角と全角のミックスでは、実行結果の「11通過・stringArray[1] -> 1丁目136番地」のようになりました、他にも個人のお好みで作成する事が出来るでしょうが、私はこれでOKです
ここまで