ランキングに戻る

mattt/Ono

Objective-C

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

objective-cxmlhtmlcssxpathlibxml2swift
スター成長
スター
2.6k
フォーク
195
週間成長
Issue
5
1k2k
2014年2月2018年3月2022年5月2026年7月
README

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.

関連リポジトリ
vsouza/awesome-ios

A curated list of awesome iOS ecosystem, including Objective-C and Swift Projects

SwiftMIT Licenseawesomeswift-library
awesomeios.dev
52.8k7k
dkhamsing/open-source-ios-apps

:iphone: Collaborative List of Open-Source iOS Apps

Creative Commons Zero v1.0 Universaliosswift
51.3k6k
serhii-londar/open-source-mac-os-apps

🚀 Awesome list of open source applications for macOS. https://t.me/s/opensourcemacosapps

Creative Commons Zero v1.0 Universalmacosmac
49.7k2.6k
SDWebImage/SDWebImage

Asynchronous image downloader with cache support as a UIImageView category

Objective-CMIT Licensemacosios
sdwebimage.github.io
25.6k6k
NativeScript/NativeScript

⚡ Write Native with TypeScript ✨ Best of all worlds (TypeScript, Swift, Objective C, Kotlin, Java, Dart). Use what you love ❤️ Angular, React, Solid, Svelte, Vue with: iOS (UIKit, SwiftUI), Android (View, Jetpack Compose), Flutter and you name it compatible.

TypeScriptnpmMIT Licensenativescriptandroid
nativescript.org
25.6k1.7k
kyleneideck/BackgroundMusic

Background Music, a macOS audio utility: automatically pause your music, set individual apps' volumes and record system audio.

C++GNU General Public License v2.0audioaudio-utility
19.2k775
OpenEmu/OpenEmu

🕹 Retro video game emulation for macOS

Swiftopenemuobjective-c
openemu.org
17.7k1.3k
hackiftekhar/IQKeyboardManager

Codeless drop-in universal library allows to prevent issues of keyboard sliding up and cover UITextField/UITextView. Neither need to write any code nor any setup required and much more.

SwiftMIT Licenseobjective-ckeyboard
16.6k2.4k
realm/realm-swift

Realm is a mobile database: a replacement for Core Data & SQLite

Objective-CApache License 2.0iosdatabase
realm.io
16.6k2.2k
Hammerspoon/hammerspoon

Staggeringly powerful macOS desktop automation with Lua

Objective-CMIT Licensemacosobjective-c
hammerspoon.org
15.8k700
facebook/infer

A static analyzer for Java, C, C++, and Objective-C

OCamlMIT Licensestatic-analysisstatic-code-analysis
fbinfer.com
15.7k2.1k
CocoaPods/CocoaPods

The Cocoa Dependency Manager.

RubyRubyGemsOtheriosdependency-manager
cocoapods.org
14.8k2.7k