//
// LibXmlEx.h
// libXml2Conv
//
// Created by xxxx on 11-11-8.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "iconv.h"
#import <libxml/parser.h>
#import <libxml/xpath.h>
@interface LibXmlEx : NSObject {
NSString *m_strFilePath;
xmlDocPtr m_pDoc;
}
//init
- (id) initXmlWithPath:(NSString*)strFilePath;
- (id) initXmlWithString:(NSString*)strData;
//finder
- (NSString*) getXmlString:(NSString*)strXpath;
//writer
- (BOOL) writeXmlString:(NSString*)strValue withXpath:(NSString*)strXpath;
//save
- (BOOL) saveXmlFile;
//tools
+ (NSString*) DocumentFilePath:(NSString*)strFileName;
@end
//
// LibXmlEx.m
// libXml2Conv
//
// Created by xxxx on 11-11-8.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
/*
Sample:
LibXmlEx* par = [[LibXmlEx alloc]initXmlWithString:xml];
NSString* strupg = [par getXmlString:@"/AuthenticateResp/upgradedomain"];
NSLog(@"======%@=======",strupg);
[par release];
*/
#import "LibXmlEx.h"
#pragma mark -
@interface LibXmlEx (private)
- (int) code_convert:(char*)from_charset to:(char*)to_charset inBuffer:(char*)inbuf
inLength:(int)inlen outBuffer:(char*)outbuf outLength:(int)outlen;
- (char*) u2g:(char*)inbuf;
- (char*) g2u:(char*)inbuf;
- (xmlXPathObjectPtr) get_nodeset:(xmlChar*)xpath;
@end
#pragma mark -
@implementation LibXmlEx
- (void) dealloc
{
if (NULL != m_pDoc) {
xmlFreeDoc(m_pDoc);
m_pDoc = NULL;
}
[super dealloc];
}
- (id) init
{
if (self = [super init]) {
}
return self;
}
- (id) initXmlWithPath:(NSString*)strFilePath
{
if (self = [super init]) {
if (NULL != strFilePath) {
m_strFilePath = [NSString stringWithFormat:@"%@",strFilePath];
xmlNodePtr curNodePtr;
m_pDoc = xmlReadFile([strFilePath UTF8String], "GB2312", XML_PARSE_RECOVER);
if (NULL == m_pDoc) {
NSLog(@"%@",@"Document not paresed sucessfully.");
xmlFreeDoc(m_pDoc);
return self;
}
curNodePtr = xmlDocGetRootElement(m_pDoc);
if (NULL == curNodePtr) {
NSLog(@"%@",@"empty document");
xmlFreeDoc(m_pDoc);
return self;
}
}
}
return self;
}
- (id) initXmlWithString:(NSString*)strData
{
if (self = [super init]) {
if (NULL != strData) {
xmlNodePtr curNodePtr;
m_pDoc = xmlReadMemory([strData UTF8String], [strData length], NULL, "GB2312", XML_PARSE_RECOVER);
if (NULL == m_pDoc) {
NSLog(@"%@",@"Document not paresed sucessfully.");
xmlFreeDoc(m_pDoc);
return self;
}
curNodePtr = xmlDocGetRootElement(m_pDoc);
if (NULL == curNodePtr) {
NSLog(@"%@",@"empty document");
xmlFreeDoc(m_pDoc);
return self;
}
}
}
return self;
}
- (NSString*) getXmlString:(NSString*)strXpath
{
xmlXPathObjectPtr result;
const char* strRel;
result = [self get_nodeset:BAD_CAST [strXpath UTF8String]];
if (NULL == result) {
NSLog(@"%@",@"get_nodeset return NULL");
return NULL;
}
xmlNodeSetPtr nodeSetPtr = result->nodesetval;
if (xmlXPathNodeSetIsEmpty(nodeSetPtr)) {
xmlXPathFreeObject(result);
NSLog(@"%@",@"xmlXPathNodeSetIsEmpty");
return NULL;
}
xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];
strRel = (const char*)xmlNodeGetContent(nodePtr);
if (NULL == strRel) {
return NULL;
}
return [NSString stringWithUTF8String:strRel];
}
- (BOOL) writeXmlString:(NSString*)strValue withXpath:(NSString*)strXpath
{
xmlXPathObjectPtr result;
result = [self get_nodeset:BAD_CAST [strXpath UTF8String]];
if (result == NULL)
{
NSLog(@"%@",@"xmlXPathEvalExpression return NULL");
return NO;
}
xmlNodeSetPtr nodeSetPtr = result->nodesetval;
if (xmlXPathNodeSetIsEmpty(nodeSetPtr))
{
xmlXPathFreeObject(result);
NSLog(@"%@",@"nodeset is empty");
return NO;
}
xmlNodePtr nodePtr = nodeSetPtr->nodeTab[0];
xmlNodeSetContent(nodePtr, BAD_CAST [strValue UTF8String] );
return YES;
}
- (BOOL) saveXmlFile
{
if (m_pDoc == NULL || [m_strFilePath isEqualToString:@""])
{
return NO;
}
int nRel = xmlSaveFormatFileEnc([m_strFilePath UTF8String],m_pDoc,"GB2312",1);
if (nRel == -1)
{
return NO;
}
return YES;
}
#pragma mark -
+ (NSString*)DocumentFilePath:(NSString*)strFileName
{
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* docDir = [paths objectAtIndex:0];
NSString* plistPath = [docDir stringByAppendingPathComponent:strFileName];
if ([[NSFileManager defaultManager] fileExistsAtPath:plistPath] == NO)
{
NSString *pathString = [[NSBundle mainBundle] resourcePath];
return pathString;
}
return plistPath;
}
@end
#pragma mark -
@implementation LibXmlEx (private)
- (int) code_convert:(char*)from_charset to:(char*)to_charset inBuffer:(char*)inbuf
inLength:(int)inlen outBuffer:(char*)outbuf outLength:(int)outlen
{
iconv_t cd;
char** pin = &inbuf;
char** pout = &outbuf;
size_t* pinlen = (size_t*)&inlen;
size_t* poutlen = (size_t*)&outlen;
cd = iconv_open(to_charset, from_charset);
if (0 == cd) {
return -1;
}
memset(outbuf,0,outlen);
if (-1 == iconv(cd, pin,pinlen, pout,poutlen)) {
return -1;
}
iconv_close(cd);
return 0;
}
- (char*) u2g:(char*)inbuf
{
int nOutLen = 2*strlen(inbuf) + 1;
char *szOut = (char*)malloc(nOutLen);
if (-1 ==[self code_convert:"utf-8" to:"gb2312" inBuffer:inbuf
inLength:strlen(inbuf) outBuffer:szOut outLength:nOutLen]) {
free(szOut);
szOut = NULL;
}
return szOut;
}
- (char*) g2u:(char*)inbuf
{
int nOutLen = 2*strlen(inbuf) + 1;
char *szOut = (char*)malloc(nOutLen);
if (-1 ==[self code_convert:"gb2312" to:"utf-8" inBuffer:inbuf
inLength:strlen(inbuf) outBuffer:szOut outLength:nOutLen]) {
free(szOut);
szOut = NULL;
}
return szOut;
}
- (xmlXPathObjectPtr) get_nodeset:(xmlChar*)xpath
{
xmlXPathContextPtr context;
xmlXPathObjectPtr result;
context = xmlXPathNewContext(m_pDoc);
if (NULL == context) {
NSLog(@"%@",@"xmlXPathNewContext return NULL");
return NULL;
}
result = xmlXPathEvalExpression(xpath, context);
xmlXPathFreeContext(context);
if (NULL == result) {
NSLog(@"%@",@"xmlXPathEvalExpression return NULL");
return NULL;
}
if (xmlXPathNodeSetIsEmpty(result->nodesetval)) {
NSLog(@"%@",@"xmlXPathNodeSetIsEmpty");
return NULL;
}
return result;
}
@end
本文介绍了如何在Objective-C中对libxml2库进行小规模的封装,以方便在XML处理中使用。通过创建接口和实现基本的XML解析功能,简化了XML文档的读取和操作过程。
1039

被折叠的 条评论
为什么被折叠?



