Swift4.2 NSXMLParserで半角と全角が混在していると読み取り結果が分離するの話 ?

# 新年明けましておめでとうございます
&nbsp;

- 目的

> 住所録とかのXMLファイルを読み込んだ場合に番地とかの半角と全角の混ざっている「1丁目136番地」と混ざってない「１丁目１３６番地」では読み取りでそのままの「１丁目１３６番地」になりますが ? 半角と全角の「1丁目136番地」では「1」と「丁目136番地」と2つに分割されて読み込まれますよね ?

では、XMLファイルのそれぞれのコードです

全てが全角

```XML全て全角.xml.swift

<!-- 番地 -->
<AddressLine addressLineType="Number">１丁目１３６番地</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">１丁目１３６番地</AddressLine>」
//実行結果
/*
 ML解析開始しました
 開始タグ:AddressLine
 0通過・string -> １丁目１３６番地
 1通過・parsedStringArray -> ["１丁目１３６番地"]
 8通過・stringArray -> ["stringArray", "１丁目１３６番地"]
 11通過・stringArray[1] -> １丁目１３６番地
 終了タグ: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です

ここまで