在Swift中使用libxml2
- //
- // main.swift
- // C150805_libxml2r2
- // http://git.oschina.net/yao_yu/Swift2015/tree/master/C150805_libxml2r2?dir=1&filepath=C150805_libxml2r2&oid=f80a7498226526b991e7913298c15cd38480aea5&sha=c073af33d0534a10098bb8fcc0706c2fd489dc3f
- //
- // Created by yao_yu on 15/8/5.
- // Copyright © 2015年 yao_yu. All rights reserved.
- //
- import Foundation
- /* ---------- 扩展 ---------- */
- extension NSString{
- convenience init?(urlString:String, encoding:NSStringEncoding) {
- let url = NSURL(string: urlString)
- do {
- try self.init(contentsOfURL: url!, encoding: encoding)
- } catch {}
- }
- }
- extension String {
- init?(XMLChar char: UnsafePointer<xmlChar>){
- self.init()
- if char != nil {
- self = String.fromCString(UnsafePointer<CChar>(char))!
- }
- }
- }
- /* ---------- XML节点 ---------- */
- class XMLNode {
- var xmlDoc:xmlDocPtr = nil
- var xmlNode:xmlNodePtr = nil
- init(node:xmlNodePtr, document:xmlDocPtr) {
- self.xmlNode = node
- self.xmlDoc = document
- }
- convenience init(document:xmlDocPtr) {
- self.init(node:xmlDocGetRootElement(document), document:document)
- }
- lazy var rawContent:String? = {
- return XMLNodeGetContent(self.xmlNode)
- // return XMLNodeGetString(self.xmlDoc, xmlNode: self.xmlNode)
- }()
- lazy var children:[XMLNode] = {
- return self.xmlNodes2XMLNodes(XMLNodeGetChildren(self.xmlNode))
- }()
- lazy var attributes: [String: String] = {
- return XMLNodeGetAttributes(self.xmlNode)
- }()
- subscript(key:String) -> String? {
- return attributes[key]
- }
- private func xmlNodes2XMLNodes(nodes:[xmlNodePtr]) -> [XMLNode] {
- var xmlNodes = [XMLNode]()
- for node in nodes{
- xmlNodes.append(XMLNode(node: node, document: xmlDoc))
- }
- return xmlNodes
- //下面的代码引发:Command failed due to signal: Abort trap: 6
- //return nodes.map{[unowned self] in XMLNode(node:$0, document:self.xmlDoc)}
- }
- }
- extension XMLNode {
- func xPath(xpath: String) -> [XMLNode] {
- return xmlNodes2XMLNodes(XMLFindXPath(self.xmlDoc, xPath: xpath))
- }
- }
- /* ---------- libxml2读取工具函数 ---------- */
- func XMLNodeGetString(doc:xmlDocPtr, xmlNode:xmlNodePtr) -> String? {
- let contentChars = xmlNodeListGetString(doc, xmlNode, )
- if contentChars == nil { return nil }
- let contentString = String(XMLChar: contentChars)
- free(contentChars)
- assert(contentString != nil, "XMLNodeGetString: 值转换不成功")
- return contentString
- }
- func XMLNodeGetContent(xmlNode:xmlNodePtr) -> String? {
- let contentChars = xmlNodeGetContent(xmlNode)
- if contentChars == nil { return nil }
- let contentString = String(XMLChar: contentChars)
- free(contentChars)
- assert(contentString != nil, "XMLNodeGetContent: 值转换不成功")
- return contentString
- }
- func XMLNodeGetChildren(xmlNode: xmlNodePtr) -> [xmlNodePtr] {
- var children = [xmlNodePtr]()
- for var childNodePointer = xmlNode.memory.children;
- childNodePointer != nil;
- childNodePointer = childNodePointer.memory.next
- {
- if xmlNodeIsText(childNodePointer) == {
- children.append(childNodePointer)
- }
- }
- return children
- }
- func XMLNodeGetAttributes(xmlNode: xmlNodePtr) -> [String: String] {
- var result:[String: String] = [String: String]()
- for var attribute: xmlAttrPtr = xmlNode.memory.properties;
- attribute != nil;
- attribute = attribute.memory.next
- {
- if let key:String = String(XMLChar: attribute.memory.name) {
- if let value:String = XMLNodeGetContent(attribute.memory.children) {
- result[key] = value
- } else {
- result[key] = ""
- }
- } else {
- print((">>>>>>>>>>>>>>>>>>>>>>>>错误:", String(XMLChar: attribute.memory.name)))
- }
- }
- return result
- }
- func XMLNodeGetAttribute(xmlNode: xmlNodePtr, key: String) -> String? {
- for var attribute: xmlAttrPtr = xmlNode.memory.properties;
- attribute != nil;
- attribute = attribute.memory.next
- {
- if key == String(XMLChar: attribute.memory.name) {
- return XMLNodeGetContent(attribute.memory.children)
- }
- }
- return nil
- }
- func XMLFindXPath(xmlDoc:xmlDocPtr, xPath: String) -> [xmlNodePtr] {
- let xPathContext = xmlXPathNewContext(xmlDoc)
- if xPathContext == nil {
- return []
- }
- xPathContext.memory.node = nil
- let xPathObject = xmlXPathEvalExpression(UnsafePointer<xmlChar>(xPath.cStringUsingEncoding(NSUTF8StringEncoding)!), xPathContext)
- xmlXPathFreeContext(xPathContext)
- if xPathObject == nil {
- return []
- }
- let nodeSet = xPathObject.memory.nodesetval
- if nodeSet == nil || nodeSet.memory.nodeNr == || nodeSet.memory.nodeTab == nil {
- xmlXPathFreeObject(xPathObject)
- return []
- }
- var resultNodes = [xmlNodePtr]()
- for i in ..< Int(nodeSet.memory.nodeNr) {
- resultNodes.append(nodeSet.memory.nodeTab[i])
- }
- xmlXPathFreeObject(xPathObject)
- return resultNodes
- }
- func XMLReadNSData(data:NSData?, encoding:NSStringEncoding = NSUTF8StringEncoding, isXML:Bool = false) -> xmlDocPtr? {
- if let data = data {
- let cBuffer = UnsafePointer<CChar>(data.bytes)
- let cSize = CInt(data.length)
- //
- // let cfEncoding = CFStringConvertNSStringEncodingToEncoding(encoding)
- // let cfEncodingAsString:CFStringRef = CFStringConvertEncodingToIANACharSetName(cfEncoding)
- // let cEncoding:UnsafePointer<CChar> = CFStringGetCStringPtr(cfEncodingAsString, CFStringEncoding(0))
- if isXML {
- let options = CInt(XML_PARSE_RECOVER.rawValue)
- return xmlReadMemory(cBuffer, cSize, nil, nil, options)
- } else {
- let options = CInt(HTML_PARSE_RECOVER.rawValue | HTML_PARSE_NOWARNING.rawValue | HTML_PARSE_NOERROR.rawValue)
- return htmlReadMemory(cBuffer, cSize, nil, nil, options)
- }
- }
- return nil
- }
- let GB18030_2000_Encoding = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.GB_18030_2000.rawValue))
- /* ---------- 测试代码 ---------- */
- class CElapseTime {
- var startTime:NSDate
- var prompt:String
- var unsed:Bool = false
- init(prompt:String) {
- self.startTime = NSDate()
- self.prompt = prompt
- }
- var newprompt:String {
- return "\(prompt)耗时:\(NSDate().timeIntervalSinceDate(startTime))"
- }
- }
- func testParseSina() {
- var sURL:String
- var encoding:UInt
- (sURL,encoding) = ("http://www.baidu.com", NSUTF8StringEncoding)
- print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\(sURL)")
- var timer = CElapseTime(prompt: "读取网页")
- //let sContent = NSString(urlString:sURL, encoding: encoding)
- var sContent:NSString? = nil
- do{
- try sContent = NSString(contentsOfFile: "/Volumes/Data/Document/Test/sample.txt", encoding: NSUTF8StringEncoding)
- } catch {
- }
- print(timer.newprompt)
- let sTimer1 = timer.newprompt
- timer = CElapseTime(prompt: "数据解析")
- if let doc = XMLReadNSData(sContent?.dataUsingEncoding(NSUTF8StringEncoding)){
- let rootNode = XMLNode(document: doc)
- let findNodes = rootNode.xPath("//div")
- for childNode in findNodes {
- autoreleasepool{
- let _ = (childNode.attributes, childNode.rawContent)
- }
- // if let content = childNode.rawContent {
- // print(content)
- // }
- }
- print(findNodes.count)
- }
- print(sTimer1)
- print(timer.newprompt)
- }
- testParseSina()
在Swift中使用libxml2的更多相关文章
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON
项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...
- Swift中的可选链与内存管理(干货系列)
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
- 在Swift中实现单例方法
在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...
- [翻译]理解Swift中的Optional
原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...
- 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型
有的小伙伴会问:博主,没有Mac怎么学Swift语言呢,我想学Swift,但前提得买个Mac.非也,非也.如果你想了解或者初步学习Swift语言的话,你可以登录这个网站:http://swiftstu ...
- swift 中指针的使用UnsafeMutablePointer
在swift中已经弱化了指针的使用,可以这么使用 let s: NSRange = NSMakeRange(, ) let at = UnsafeMutablePointer<NSRange&g ...
- swift 中数据类型那个的转换
在swift中关于数据类型的转换,如果参数是可选类型? 那么打印或者转换的结果 会带有Optional 字样,,
- swift中Range的使用书名
在swift中Range有两种用法 1.把字符串转换成NSString来使用 //这里是把swift的字符换转换成了nsstring 使用 let str :NSString = text.strin ...
随机推荐
- 网上下载的 java开源项目 如何 打jar包
目前很多java开源项目(例如qlexpress)只提供了源码,没有提供jar,下面提供maven打jar包的方法. 1.进入qlexpress下载后源代码所在的目录,此目录应包含pom.xml,如下 ...
- iOS开发 Xcode中的Info.plist字段含义
Info.plist用于向iOS提供关于app,bundle或者framework的一些重要信息.它指定了比如一个应用应该怎样启动,它如何被本地化,应用的名称,要显示的图标,还有更多.Info.pli ...
- java接口相关例题
java接口相关习题 interface Graphics{ //接口里面只能用抽象方法 public abstract double area(); }//设置 平面类class Plan ...
- 编译C++,找不到头文件(fatal error: string: No such file or directory)
在androidproject中编译C++时,找不到头文件,报错例如以下: fatal error: string: No such file or directory 解决该问题须要在Android ...
- 使用solrj操作solr索引库,solr是lucene服务器
客户端开发 Solrj 客户端开发 Solrj Solr是搭建好的lucene服务器 当然不可能完全满足一般的业务需求 可能 要针对各种的架构和业务调整 这里就需要用到Solrj了 Solrj是Sol ...
- How and Why Unsafe is Used in Java---reference
By Peter Lawrey https://www.voxxed.com/blog/2014/12/how-and-why-unsafe-is-used-in-java/ Overview sun ...
- Using JAAS Authentication in Java Clients---weblogic document
The following topics are covered in this section: JAAS and WebLogic Server JAAS Authentication Devel ...
- TableView的优化
一:什么是TableView的优化以及为什么要优化 1)CPU(中央处理器)和GPU(图形处理器):CPU主要从事逻辑计算的一些工作:GPU主要从事图形处理方面的工作. 2)CPU和GPU的共同点: ...
- 从源码角度理解android动画Interpolator类的使用
做过android动画的人对Interpolator应该不会陌生,这个类主要是用来控制android动画的执行速率,一般情况下,如果我们不设置,动画都不是匀速执行的,系统默认是先加速后减速这样一种动画 ...
- 如何让MFC程序关闭按钮失效,也无法右击任务栏关闭窗口来关闭?
如何让MFC程序关闭按钮失效,也无法右击任务栏关闭窗口来关闭,即右键任务栏的关闭窗口失效呢?很简单,有一个小窍门就是:响应IDCANCEL消息,具体实现如下: 首先定义消息映射:ON_BN_CLICK ...