반응형
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
- https://daewonyoon.tistory.com/448 : Swift XMLCoder
728x90
'프로그래밍 > SWIFT' 카테고리의 다른 글
[XPC] 새로운 타겟에서 xpc service 사용하기 Error Domain=NSCocoaErrorDomain Code=4099 (0) | 2022.09.08 |
---|---|
[Swift|번역] Process waitUntilExit 은 비동기 completion handler 와 같이 쓰지 않는다. (0) | 2022.08.09 |
[Swift] error: concurrency is only available in macOS 10.15.0 or newer (0) | 2022.07.19 |
100DaysOfSwiftUI - Day 26 (0) | 2022.07.19 |
Swift on Ubuntu error: cannot find 'URLRequest' in scope (0) | 2022.07.18 |