SwiftyXML
The most swifty way to deal with XML data in swift 5.
Install / Use
/learn @chenyunguiMilook/SwiftyXMLREADME
SwiftyXML
SwiftyXML use most swifty way to deal with XML data.
Features
- [x] Infinity subscript
- [x] dynamicMemberLookup Support (use $ started string to subscript attribute)
- [x] Optional | Non-optional value access
- [x] Directly access Enum type value (enums extends from RawRepresentable)
- [x] Directly for loop in XML children nodes
- [x] Accurate error throwing
- [x] XML construct, formatting
- [x] Single source file
Sample XML:
<catalog>
<product description="Cardigan Sweater" product_image="cardigan.jpg" >
<catalog_item gender="Men's" >
<item_number>QWZ5671</item_number>
<price>39.95</price>
<size description="Medium" >
<color_swatch image="red_cardigan.jpg" >Red</color_swatch>
<color_swatch image="burgundy_cardigan.jpg" >Burgundy</color_swatch>
</size>
<size description="Large" >
<color_swatch image="red_cardigan.jpg" >Red</color_swatch>
<color_swatch image="burgundy_cardigan.jpg" >Burgundy</color_swatch>
</size>
</catalog_item>
<catalog_item gender="Women's" >
<item_number>RRX9856</item_number>
<price>42.50</price>
<size description="Small" >
<color_swatch image="red_cardigan.jpg" >Red</color_swatch>
<color_swatch image="navy_cardigan.jpg" >Navy</color_swatch>
<color_swatch image="burgundy_cardigan.jpg" >Burgundy</color_swatch>
</size>
</catalog_item>
</product>
</catalog>
With SwiftyXML all you have to do is:
let xml = XML(string: xmlContent)
let color0 = xml.product.catalog_item.size.color_swatch.1.string //"Burgundy"
// notice that, we use "$" prefix for subscript attribute
let description0 = xml.product.catalog_item.size.1.$description.string //"Large"
This is same as below, SwiftyXML will auto pick the first element as default:
let xml = XML(data: xmlFileData)
let color = xml.product.0.catalog_item.0.size.0.color_swatch.1.string //return "Burgundy"
What about if you input some wrong keys:
let xml = XML(data: xmlFileData)
// print the error
if let color1 = xml.product.catalog_item.wrong_size.wrong_color.1.xml {
// do stuff ~
print(color1)
} else {
print(xml.product.catalog_item.wrong_size.wrong_color.1.error) //.product.0.catalog_item.0: no such children named: "wrong_size"
}
Requirements
- iOS 17.0+ | macOS 14.0+ | tvOS 17.0+ | watchOS 10.0+
- Xcode 16.2
Build & Test
Swift Package Manager
swift build
swift test
Mac Catalyst 17
xcodebuild -scheme SwiftyXML -destination "generic/platform=macOS,variant=Mac Catalyst" build
Installation
CocoaPods
You can use CocoaPods to install SwiftyXML by adding it to your Podfile:
platform :ios, '8.0'
use_frameworks!
target 'MyApp' do
pod 'SwiftyXML', '~> 3.0.0'
end
Carthage
Create a Cartfile that lists the framework and run carthage update. Follow the instructions to add $(SRCROOT)/Carthage/Build/iOS/SwiftyXML.framework to an iOS project.
github "chenyunguiMilook/SwiftyXML" ~> 3.0.0
Manually
- Download and drop
XML.swiftinto your project. - Congratulations!
Swift Package Manager
You can use The Swift Package Manager to install SwiftyXML by adding the proper description to your Package.swift file:
.package(url: "https://github.com/chenyunguiMilook/SwiftyXML.git", from: "3.0.2")
Usage
Initialization
import SwiftyXML
let xml = XML(data: xmlFileData)
Access XML and print out the error
if let color1 = xml.product.catalog_item.wrong_size.wrong_color.1.xml {
// do stuff ~
print(color1)
} else {
print(xml.product.catalog_item.wrong_size.wrong_color.1.error)
}
Catch the error
// catch the error
do {
let color = try xml.product.catalog_item.wrong_size.wrong_color.1.getXML()
print(color)
} catch {
print(error)
}
Access XML List
// handle xml list
for catalog in xml.product.catalog_item {
for size in catalog.size {
print(size.$description.stringValue)
}
}
Read Enums
// read enum value, Notice: enum need implements RawRepresentable
public enum Color : String {
case Red, Navy, Burgundy
}
if let c: Color = xml.product.catalog_item.size.color_swatch.enum() {
print(c)
}
Construct XML
let store = XML(name: "store")
.addAttribute(name: "description", value: "Ball Store")
.addChildren([
// attributes can be added in the initializer
XML(name: "product", attributes: [
"name": "football",
"weight": 0.453
])
])
// attributes can be added to an existing object
let product2 = XML(name: "product")
product2.addAttribute(name: "name", value: "basketball")
product2.addAttribute(name: "weight", value: 0.654)
// children can be added to an existing object
store.addChild(product2)
print(store.toXMLString())
// store xml output
<store description="Ball Store" >
<product name="football" weight="0.453" />
<product name="basketball" weight="0.654" />
</store>
构建与测试
核心命令
- 标准构建:
swift build - Mac Catalyst 17:
xcodebuild -scheme SwiftyXML -destination "generic/platform=macOS,variant=Mac Catalyst" build - 运行测试:
swift test
Related Skills
node-connect
354.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
112.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
354.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
354.0kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
