• Stars
    star
    2,603
  • Rank 17,600 (Top 0.4 %)
  • Language
    Objective-C
  • License
    MIT License
  • Created almost 11 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A sensible way to deal with XML & HTML for iOS & macOS

Ono (æ–§)

Foundation lacks a convenient, cross-platform way to work with HTML and XML. NSXMLParser is an event-driven, SAX-style API that can be cumbersome to work with. NSXMLDocument, offers a more convenient DOM-style API, but is only supported on macOS.

Ono offers a sensible way to work with XML & HTML on Apple platforms in Objective-C and Swift

Whether your app needs to scrape a website, parse an RSS feed, or interface with a XML-RPC webservice, Ono will make your day a whole lot less terrible.

Ono (斧) means "axe", in homage to Nokogiri (鋸), which means "saw".

Features

  • Simple, modern API following standard Objective-C conventions, including extensive use of blocks and NSFastEnumeration
  • Extremely performant document parsing and traversal, powered by libxml2
  • Support for both XPath and CSS queries
  • Automatic conversion of date and number values
  • Correct, common-sense handling of XML namespaces for elements and attributes
  • Ability to load HTML and XML documents from either NSString or NSData
  • Full documentation
  • Comprehensive test suite

Installation

CocoaPods is the recommended method of installing Ono. Add the following line to your Podfile:

Podfile

pod 'Ono'

Usage

Swift

import Foundation
import Ono

guard let url = Bundle.main.url(forResource: "nutrition", withExtension: "xml"),
    let data = try? Data(contentsOf: url) else
{
    fatalError("Missing resource: nutrition.xml")
}

let document = try ONOXMLDocument(data: data)
document.rootElement.tag

for element in document.rootElement.children.first?.children ?? [] {
    let nutrient = element.tag
    let amount = element.numberValue!
    let unit = element.attributes["units"]!

    print("- \(amount)\(unit) \(nutrient)")
}

document.enumerateElements(withXPath: "//food/name") { (element, _, _) in
    print(element)
}

document.enumerateElements(withCSS: "food > serving[units]") { (element, _, _) in
    print(element)
}

Objective-C

#import "Ono.h"

NSData *data = ...;
NSError *error;

ONOXMLDocument *document = [ONOXMLDocument XMLDocumentWithData:data error:&error];
for (ONOXMLElement *element in document.rootElement.children) {
    NSLog(@"%@: %@", element.tag, element.attributes);
}

// Support for Namespaces
NSString *author = [[document.rootElement firstChildWithTag:@"creator" inNamespace:@"dc"] stringValue];

// Automatic Conversion for Number & Date Values
NSDate *date = [[document.rootElement firstChildWithTag:@"created_at"] dateValue]; // ISO 8601 Timestamp
NSInteger numberOfWords = [[[document.rootElement firstChildWithTag:@"word_count"] numberValue] integerValue];
BOOL isPublished = [[[document.rootElement firstChildWithTag:@"is_published"] numberValue] boolValue];

// Convenient Accessors for Attributes
NSString *unit = [document.rootElement firstChildWithTag:@"Length"][@"unit"];
NSDictionary *authorAttributes = [[document.rootElement firstChildWithTag:@"author"] attributes];

// Support for XPath & CSS Queries
[document enumerateElementsWithXPath:@"//Content" usingBlock:^(ONOXMLElement *element, NSUInteger idx, BOOL *stop) {
    NSLog(@"%@", element);
}];

Demo

Build and run the example project in Xcode to see Ono in action, or check out the provided Swift Playground.

Requirements

Ono is compatible with iOS 5 and higher, as well as macOS 10.7 and higher. It requires the libxml2 library, which is included automatically when installed with CocoaPods, or added manually by adding "libxml2.dylib" to the target's "Link Binary With Libraries" build phase.

Contact

Mattt

License

Ono is available under the MIT license. See the LICENSE file for more info.

More Repositories

1

GroundControl

Remote configuration for iOS
Objective-C
1,946
star
2

CargoBay

The Essential StoreKit Companion
Objective-C
1,770
star
3

Euler

Swift Custom Operators for Mathematical Notation
Swift
1,156
star
4

AnimatedGIFImageSerialization

Complete Animated GIF Support for iOS, with Functions, NSJSONSerialization-style Class, and (Optional) UIImage Swizzling
Objective-C
1,087
star
5

TransformerKit

A block-based API for NSValueTransformer, with a growing collection of useful examples.
Objective-C
848
star
6

Navajo

Password Validator & Strength Evaluator
Objective-C
836
star
7

SkyLab

Multivariate & A/B Testing for iOS and Mac
Objective-C
790
star
8

Orbiter

Push Notification Registration for iOS
Objective-C
673
star
9

NSEtcHosts

/etc/hosts with NSURLProtocol
Objective-C
666
star
10

Chroma-Hash

A colorful visualization of password field input
JavaScript
624
star
11

rack-scaffold

Automatically generate REST APIs from Core Data models
Ruby
528
star
12

sinatra-param

Parameter Validation & Type Coercion for Sinatra
Ruby
519
star
13

InflectorKit

Efficiently Singularize and Pluralize Strings
Objective-C
476
star
14

NSSortDescriptor-WilsonRank

The Correct Way To Rank Up/Down Voted Items
Objective-C
433
star
15

Antenna

Extensible Remote Logging for iOS
Objective-C
424
star
16

Godzippa

Godzippa! - GZip Compression / Decompression Category for NSData
Objective-C
424
star
17

CommonMarkAttributedString

Create NSAttributedStrings from Markdown Text
Swift
421
star
18

rack-push-notification

A Rack-mountable webservice for managing push notifications
Ruby
378
star
19

TTTLocalizedPluralString

NSLocalizedString with a Count Argument
Objective-C
378
star
20

CupertinoYankee

An NSDate Category With Locale-Aware Calculations for Beginning & End of Day, Week, Month, and Year
Objective-C
305
star
21

WebPImageSerialization

Complete WebP Support for iOS, with Functions, NSJSONSerialization-style Class, and (Optional) UIImage Swizzling
C
282
star
22

CHChromaHashView

A classic password visualization concept, ported to iOS
Objective-C
273
star
23

Xcode-Licensed-Templates

Minimal Xcode Templates for Open Source Developers
255
star
24

GeoJSONSerialization

Encode & Decode Between GeoJSON & MapKit Shapes
Objective-C
231
star
25

terminal-share

Command Line & Ruby Interface to Mac OS X Sharing Services
Objective-C
228
star
26

TTTRandomizedEnumerator

Mix things up with your collection classes with style and class (well, a category, but you get the idea).
Objective-C
223
star
27

BritishInvasion

Localise Your .m Files, For Queen And Country 🇬🇧
Objective-C
212
star
28

OpenAI

A Swift client for the OpenAI API.
Swift
181
star
29

AnyJSON

Encode / Decode JSON By Any Means Possibleâ„¢
Objective-C
119
star
30

MsgPackSerialization

MsgPack Serialization for Objective-C
C
96
star
31

Morse.js

A jQuery Plugin to annotate text with Morse Code
JavaScript
95
star
32

rack-smart-app-banner

Rack middleware to automatically include code for Smart App Banners on iOS
Ruby
85
star
33

vCardSerialization

Encodes and decodes between vCard files and AddressBook records.
Objective-C
69
star
34

UIFontSerialization

Encode and decode between UIFont and Postscript font data
Objective-C
64
star
35

rack-http-logger

Log metrics from HTTP request parameters according to l2met conventions
Ruby
57
star
36

rack-passbook

Rack middleware that provides Passbook web service endpoints.
Ruby
52
star
37

rack-in-app-purchase

Rack middleware that manages products for in-app-purchases and verifies receipts.
Ruby
51
star
38

swift-package-registry-oas

OpenAPI Specification for proposed Swift Package Registry web service
Swift
41
star
39

core_data

Parse Core Data Model (.xcdatamodel) Files
Ruby
39
star
40

swift-registry

A reference implementation of the Swift Package Registry, written in Swift and using Git as a database / transparent log.
Swift
37
star
41

rack-subdomain

Rack middleware to transparently route requests with a subdomain to a specified path with substitutions
Ruby
37
star
42

rack-newsstand

Automatically generate webservice endpoints for Newsstand
Ruby
33
star
43

rack-remote-configuration

Serve property list or JSON configuration files
Ruby
24
star
44

commoditize

A command-line utility for macOS that mounts a Docker container image as an external disk image.
Shell
20
star
45

swift-package-sbom

A software bill of materials (SBoM) generator for Swift packages
Swift
17
star
46

vscode-unicorn

🦄💬 A Visual Studio Code extension that adds a status bar entry showing Unicode data for the currently selected character.
TypeScript
15
star
47

hype

Write Python functions. Call them from language models.
Python
15
star
48

Sonic-Hash

A melodic Sonification of password field input
JavaScript
14
star
49

NFPA704View

UIView Subclass for NFPA 704 "Fire Diamonds"
Objective-C
13
star
50

swift-package-registry-codeartifact

A basic implementation of the Swift package registry interface that uses AWS CodeArtifact as a backend for package releases and assets.
TypeScript
10
star
51

rack-heroku-no-such-app

Rack middleware to prevent loading from `*.heroku.com` / `*.herokuapp.com` addresses
Ruby
9
star
52

glitz

Glitz adds ANSI-colorized glamour to your terminal output
Ruby
9
star
53

replicate-swift

Unofficial Swift client for the Replicate API
Swift
8
star
54

swift-package-serialization-lambda

Swift
7
star
55

cog-replicate-logo-generator

Python
5
star
56

rack-typekit

Rack middleware to automatically inject Typekit into webpages
Ruby
4
star
57

CycloneDX

Swift
4
star
58

swift-registry-benchmark-harness

A harness for benchmarking the performance of building a project with Swift Package Manager using the new package registry interface.
Ruby
4
star
59

documentation-block

[WIP] View symbol documentation for a file
TypeScript
3
star