Archive for 六月 2010

Mac: 基于事件的XML解析器(NSXMLParser)

XML用处很大… 用得很广… 最简单的来说用PHP和Javascript, JQuery都可以简单解析一个整齐的树结构XML文件

但是我们可爱的佛典网XML为复杂结构, 于是乎xslt帮不上什么忙了……我希望在新版的佛典中能包含所有的佛经, 于是简单并且高效的使用所有中华佛典网上的XML就是我的目标了.

于是,基于事件的XML解析器(Event-Driven XML Parser) NSXMLParser 就是我必须用到的了

继续前面的两篇Mac平台程序设计
Mac:打开一个目录
Mac:得到一个目录内的内容


1, 更改界面, 添加一个”解析一个目录里面的第一个的文件”的按钮

2, 构建XML解析部分

//1, 构建解析方法
-(void)parseXMLFile:(NSURL *)XMLURL //XMLURL为第一个文件的URL
{
	NSXMLParser *eventParser = [[NSXMLParser alloc] initWithContentsOfURL:XMLURL];
	[eventParser setDelegate:self];  //设置代理为本地
	[eventParser parse];  //开始解析
 
	NSLog(@"end Of parseXMLFile");
}
//2, 解析开始后,所有XML的内容由NSXMLParserDelegate处理
//  所以一定要注意在本地添加<NSXMLParserDelegate>到文件头
//在NSXMLParser读到<p>的时候重写一个<p>标签,原来的是XML中的,无法直接使用
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
	namespaceURI:(NSString *)namespaceURI 
	qualifiedName:(NSString *)qName 
	attributes:(NSDictionary *)attributeDict
{
	if ([elementName isEqualToString:@"p"]) {
		[htmlDataString appendFormat:@"<p>"];
		needOrNot = YES;  //我们需要<p>和</p>中间的内容,其余的在end中设置NO
		return;
	}
}
 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
	if(needOrNot)
	{
		[htmlDataString appendString:string]; //如上,将需要的字段添加到得到的html结构String中
	}
}
 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
	namespaceURI:(NSString *)namespaceURI 
	qualifiedName:(NSString *)qName
{
	if ([elementName isEqualToString:@"p"]) {
		[htmlDataString appendFormat:@"</p>"];
		needOrNot = NO;  //不需要的内容不允许上面的delegate去读取到htmlDataString中
		return;
	}
}
 
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
	NSLog(htmlDataString); //在结束后输出得到的html数据结构.
}

这样我就可以对佛典网的复杂结构xml开始分析了, 之后会放出更多对该xml处理的细节

Mac:得到一个目录内的内容

首先是打开一个目录

然后

1, 使用NSFileManager来得到这个目录的内容

NSArray *contentArray = [[NSFileManager defaultManager] 
	 contentsOfDirectoryAtURL:[[oPanel URLs] objectAtIndex:0] 
	//oPanel是上个帖子中的NSOpenPanel对象
	 includingPropertiesForKeys:[NSArray array]
	 options:0 
	 error:nil];
//我们得到一个Array的NSURL

2, 简单显示这个Array中的内容

	for(id innerUrl in contentArray)
	{
		NSLog([innerUrl absoluteString]);
	}

3, 结果

run
[Switching to process 3626]
Running…
2010-06-17 23:32:43.409 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0001.xml
2010-06-17 23:32:43.411 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0002.xml
2010-06-17 23:32:43.411 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0003.xml
2010-06-17 23:32:43.411 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0004.xml
2010-06-17 23:32:43.411 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0005.xml
2010-06-17 23:32:43.411 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0006.xml
2010-06-17 23:32:43.412 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0007.xml


*在简单输出含有空格的URL的String的时候会出现一定乱码, 如果有需要, 我会去分析为什么

Mac:打开一个目录

1, 获得一个打开窗口对象 NSOpenPanel

NSOpenPanel *oPanel = [NSOpenPanel openPanel]; //快捷建立方式不用释放, 我还记得, 你呢?

2, 设置这个对象的参数

	[oPanel setCanChooseDirectories:YES]; //可以打开目录
	[oPanel setCanChooseFiles:NO]; //不能打开文件(我需要处理一个目录内的所有文件)
	[oPanel setDirectory:NSHomeDirectory()]; //起始目录为Home

3, 处理得到的数据

	if ([oPanel runModal] == NSOKButton) {  //如果用户点OK
		NSLog([[[oPanel URLs] objectAtIndex:0] absoluteString]); 
		//我在console输出这个目录的地址
	}

4, 结果

[Switching to process 3330]
Running…
2010-06-17 22:49:02.583 XML2HTML[3330:a0f] file://localhost/Users/kingmtn/Music/

5, 简单的界面

只需要一个NSButton,并且将这个NSButton的缺省行为链接到我的对象方法-(IBAction)openDirectoryButtonClick:(id)sender上就可以了

*这是我XML2HTML工程的第一部分

基于Air的本地Google Analytics客户端

看着自己原来写的博客还有这么高的浏览量真是惭愧,愧对那些看我博客的朋友. 最近iOS开发功力恢复中,希望尽快恢复佛典的继续开发,不为别的,只为曾经说过.

看自己网站的浏览量是非常开心得事情,当然前题是你的网站流量还满意….

Polaris是一个非常简单的,免费的Google Analytics客户端. 基于Air代表着Mac, Windows都OK. 非常不错得界面,大家试试吧, 懒得登录google的好选择.

下载

简单增加WordPress的安全性

处于安全考虑, 应该在Wordpress的模板中移除以下语句:

  <?php remove_action('wp_head', 'wp_generator'); ?>

这条语句生成正在使用的WP版本