본문 바로가기

프로그래밍/SWIFT

[Swift] SwiftyXMLParser 를 이용해 xml 트리구조 보기

반응형

Swift 의 XML 라이브러리들 중에서, SwiftyXMLParser 라는 라이브러리가 있다. 파이썬의 xmltodict 처럼, 임의의 xml 을 좀 간단하게 파싱해주는 라이브러리이다. 파싱된 xml 의 트리구조를 간단히 보고 싶었는데, 트리구조를 보여주는 예제가 없어서, 만들어 보았다. 

import Foundation
import SwiftyXMLParser

func xmlPrint(_ xml: XML.Accessor, _ nIndent: Int = 0, _ seqIndex: Int = -1) {
    var indent : String {
        String(repeating: "  ", count: nIndent)
    }

    switch(xml) {
        case .singleElement(let element) : 
            
            if let text = element.text {
                print(indent, (seqIndex == -1) ? "":"\(seqIndex)", element.name, ":", text.trimmingCharacters(in: .whitespacesAndNewlines))
            } else {
                print(indent, (seqIndex == -1) ? "":"\(seqIndex)", element.name, ":", element.text ?? "no-text")
            }
            
            for ele in element.childElements {
                xmlPrint(XML.Accessor(ele), nIndent + 1)
            }
            break

        case .sequence(let elements) : 

            for (i, ele) in elements.enumerated() {
                xmlPrint(XML.Accessor(ele), nIndent + 1, i)
            }
            break

        default: 
            print("default")
            break
    }    

}


func main() {
    let xmlString = """
    <Root>
        <TaxRate>7.25</TaxRate>
        <Data>
            <Category>A</Category>
            <Quantity>3</Quantity>
            <Price>24.50</Price>
        </Data>
        <Data>
            <Category>B</Category>
            <Quantity>1</Quantity>
            <Price>89.99</Price>
        </Data>
        <Data>
            <Category>A</Category>
            <Quantity>5</Quantity>
            <Price>4.95</Price>
        </Data>
    </Root>
    """

    if  let xml = try? XML.parse(xmlString) {
        xmlPrint(xml)
    }
}

main()

XML.parse 함수가 SwiftXMLParser 의 함수이고, 이 결과값은 XML.Accessor? 형이다. xml 트리의 각 노드에 해당하는 타입이고, 루트노드부터 재귀적으로 자식노드들을 출력하는 간단한 예제이다. 실행결과는 다음과 같다.

swiftyxmlparser_sample$ swift run
Building for debugging...
[5/5] Linking swiftyxmlparser_sample
Build complete! (1.65s)
  XML.Parser.AbstructedDocumentRoot : no-text
    Root :
      TaxRate : 7.25
      Data :
        Category : A
        Quantity : 3
        Price : 24.50
      Data :
        Category : B
        Quantity : 1
        Price : 89.99
      Data :
        Category : A
        Quantity : 5
        Price : 4.95

 

 

 

728x90