Latest 4.2.1
Homepage https://github.com/OpenClemson/AEXML-CU
License MIT
Platforms ios 8.0, osx 10.9, tvos 9.0, watchos 2.0
Authors

Simple and lightweight XML parser written in Swift. A fork of AEXML.

Language Swift 3.0
Platforms iOS | watchOS | tvOS | OSX
License MIT

CocoaPods Version
Swift Package Manager compatible

This is not a robust full featured XML parser, but rather simple,
lightweight and easy to use utility for casual XML handling.

Index

Features

  • Read XML data
  • Write XML string
  • Covered with unit tests
  • Covered with inline docs

Usage

Read XML

Let’s say this is some XML string you picked up somewhere and made a variable data: Data from that.

<?xml version="1.0" encoding="utf-8"?>
<animals>
    <cats>
        <cat breed="Siberian" color="lightgray">Tinna</cat>
        <cat breed="Domestic" color="darkgray">Rose</cat>
        <cat breed="Domestic" color="yellow">Caesar</cat>
        <cat></cat>
    </cats>
    <dogs>
        <dog breed="Bull Terrier" color="white">Villy</dog>
        <dog breed="Bull Terrier" color="white">Spot</dog>
        <dog breed="Golden Retriever" color="yellow">Betty</dog>
        <dog breed="Miniature Schnauzer" color="black">Kika</dog>
    </dogs>
</animals>

This is how you can use AEXML for working with this data:
(for even more examples, look at the unit tests code included in project)

guard let
    let xmlPath = Bundle.main.path(forResource: "example", ofType: "xml"),
    let data = try? Data(contentsOf: URL(fileURLWithPath: xmlPath))
else { return }

do {
    let xmlDoc = try AEXMLDocument(xml: data, options: options)

    // prints the same XML structure as original
    print(xmlDoc.xml)

    // prints cats, dogs
    for child in xmlDoc.root.children {
        print(child.name)
    }

    // prints Optional("Tinna") (first element)
    print(xmlDoc.root["cats"]["cat"].value)

    // prints Tinna (first element)
    print(xmlDoc.root["cats"]["cat"].string)

    // prints Optional("Kika") (last element)
    print(xmlDoc.root["dogs"]["dog"].last?.value)

    // prints Betty (3rd element)
    print(xmlDoc.root["dogs"].children[2].string)

    // prints Tinna, Rose, Caesar
    if let cats = xmlDoc.root["cats"]["cat"].all {
        for cat in cats {
            if let name = cat.value {
                print(name)
            }
        }
    }

    // prints Villy, Spot
    for dog in xmlDoc.root["dogs"]["dog"].all! {
        if let color = dog.attributes["color"] {
            if color == "white" {
                print(dog.string)
            }
        }
    }

    // prints Tinna
    if let cats = xmlDoc.root["cats"]["cat"].all(withValue: "Tinna") {
        for cat in cats {
            print(cat.string)
        }
    }

    // prints Caesar
    if let cats = xmlDoc.root["cats"]["cat"].all(withAttributes: ["breed" : "Domestic", "color" : "yellow"]) {
        for cat in cats {
            print(cat.string)
        }
    }

    // prints 4
    print(xmlDoc.root["cats"]["cat"].count)

    // prints Siberian
    print(xmlDoc.root["cats"]["cat"].attributes["breed"]!)

    // prints <cat breed="Siberian" color="lightgray">Tinna</cat>
    print(xmlDoc.root["cats"]["cat"].xmlCompact)

    // prints Optional(AEXML.AEXMLError.elementNotFound)
    print(xmlDoc["NotExistingElement"].error)
}
catch {
    print("(error)")
}

Write XML

Let’s say this is some SOAP XML request you need to generate.
Well, you could just build ordinary string for that?

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Header>
    <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:mustUnderstand="1">234</m:Trans>
  </soap:Header>
  <soap:Body>
    <m:GetStockPrice>
      <m:StockName>AAPL</m:StockName>
    </m:GetStockPrice>
  </soap:Body>
</soap:Envelope>

Yes, but, you can also do it in a more structured and elegant way with AEXML:

// create XML Document
let soapRequest = AEXMLDocument()
let attributes = ["xmlns:xsi" : "http://www.w3.org/2001/XMLSchema-instance", "xmlns:xsd" : "http://www.w3.org/2001/XMLSchema"]
let envelope = soapRequest.addChild(name: "soap:Envelope", attributes: attributes)
let header = envelope.addChild(name: "soap:Header")
let body = envelope.addChild(name: "soap:Body")
header.addChild(name: "m:Trans", value: "234", attributes: ["xmlns:m" : "http://www.w3schools.com/transaction/", "soap:mustUnderstand" : "1"])
let getStockPrice = body.addChild(name: "m:GetStockPrice")
getStockPrice.addChild(name: "m:StockName", value: "AAPL")

// prints the same XML structure as original
print(soapRequest.xml)

Installation

License

AEXML is released under the MIT license. See LICENSE for details.

Latest podspec

{
    "name": "AEXML-CU",
    "version": "4.2.1",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    },
    "summary": "A fork of AEXML: Simple and lightweight XML parser written in Swift",
    "homepage": "https://github.com/OpenClemson/AEXML-CU",
    "authors": {
        "Tanner Stokes": "[email protected]"
    },
    "source": {
        "git": "https://github.com/OpenClemson/AEXML-CU.git",
        "tag": "4.2.1"
    },
    "source_files": "Sources/*.swift",
    "pod_target_xcconfig": {
        "SWIFT_VERSION": "3.0"
    },
    "platforms": {
        "ios": "8.0",
        "osx": "10.9",
        "tvos": "9.0",
        "watchos": "2.0"
    },
    "pushed_with_swift_version": "3.0"
}

Pin It on Pinterest

Share This