在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 ...
随机推荐
- 网易云音乐 歌词制作软件 BesLyric
导读 哈哈,喜欢网易云音乐,又愁于制作歌词的童鞋有福啦! BesLyric 为你排忧解难! 上个周末在用网易云音乐听歌,发现一些喜欢的歌还没有滚动歌词,然而网易云音乐还没有自带的歌词编辑功能,要制作歌 ...
- 【转】Android Studio Essential Training
http://ask.android-studio.org/?/explore/category-video Android Studio Essential Training内容包括:- Andro ...
- 深入了解Angularjs指令中的ngModel
关于AngularJs的指令的知识学习,请参考... 这次我们接上次没讲完的知识继续. 前端人员在设计表单逻辑时, 在大部分情况下,我们需要为表单定义很多指令, 比如比较两个input内的值是否相同, ...
- C# richTextBox封装的一个打印的类
附件 http://files.cnblogs.com/xe2011/CSharpWinForm_richTextBoxPrintClass.rar 在窗体上一个Richtextbox 控件 和3个按 ...
- [Java Performance] 数据库性能最佳实践 - JPA和读写优化
数据库性能最佳实践 当应用须要连接数据库时.那么应用的性能就可能收到数据库性能的影响. 比方当数据库的I/O能力存在限制,或者因缺失了索引而导致运行的SQL语句须要对整张表进行遍历.对于这些问题.只相 ...
- TCP 连接的建立和终止
三路握手 建立一个TCP连接时会发生下述情形. (1)服务器必须准备好接受外来的连接.这通常通过调用socket.bind和listen这3个函数来完成的,我们称之为被动打开. (2)客户通过调用co ...
- HDU2083JAVA
简易版之最短距离 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- WTL的消息机制
Windows消息 众所周知,Windows消息有两种:队列话消息和非队列话消息.队列话消息是被Windows操作系统放入消息队列的,程序通过主消息循环不断的从消息队列中取出消息并分发到各自的窗体调用 ...
- Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据
1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协 ...
- Android(java)学习笔记182:保存数据到SD卡 (附加:保存数据到内存)
1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...