XMLStreamReader的对目标C iPhone?

我使用的XMLWriter生成的XML。 现在,我想读这个XML与一些读者库/框架。 是否有可用于此的任何补充框架/库。

目前我正在使用TouchXML库读取此,但它不是在它不支持流读预期方式工作。

我想这样做:

XmlReader pReader = XmlTextReader.Create(pPath); while (pReader.Read()){ switch (pReader.LocalName){ case EXPEL_DEVICES: { //if ((pImportFlags & (int)ExportClass.Devices) != 0) //{ for (pReader.ReadToFollowing(LOCAL_NAME, NAMESPACE_EXPORT); !pReader.EOF && pReader.LocalName == @"NAME"; ) { if (!pReader.ReadToFollowing(DEVICE_ID, NAMESPACE_EXPORT)) throw new AException(DEVICE_ID); NSString *value = pReader.ReadElementContentAsString(); } } break; } }

--------------解决方案-------------

失去我自己的声誉值50后,我终于用libxml2和使我的XMLStreamReader类下面,我希望我能发现这个早些时候:P。 请注意,使用此,我们需要包括libxml2.dylib inot我们的框架,并在构建设置不加-lxml2 其他连接标志 ,并在标题搜索路径添加/usr/include/libxml2

头文件:

#import <Foundation/Foundation.h>
#import <libxml/xmlreader.h>

@interface XMLStreamReader : NSObject {
xmlTextReaderPtr xmlReader;
}

@property (nonatomic, readonly, assign) BOOL eof;
@property (nonatomic, readonly, retain) NSString *localName;
@property (nonatomic, readonly, assign) xmlElementType nodeType;
@property (nonatomic, readonly, assign) BOOL read;
@property (nonatomic, readonly, assign) BOOL readElementContentAsBoolean;
@property (nonatomic, readonly, retain) NSString *readElementContentAsString;

- (void) close;
- (id) getAttribute:(NSString *) paramName;
- (id) initWithPath:(NSString *) path;
@end

实现文件:

#import "XMLStreamReader.h"

@implementation XMLStreamReader

@dynamic eof;
@dynamic localName;
@dynamic nodeType;
@dynamic read;
@dynamic readElementContentAsBoolean;
@dynamic readElementContentAsString;

- (void) dealloc{
xmlFreeTextReader(xmlReader);
[super dealloc];
}

/**
* xmlTextReaderClose:
* @reader: the xmlTextReaderPtr used
*
* This method releases any resources allocated by the current instance
* changes the state to Closed and close any underlying input.
*
* Returns 0 or -1 in case of error
*/
- (void) close{
xmlTextReaderClose(xmlReader);
}

/**
* @reader: the xmlTextReaderPtr used
* @name: the qualified name of the attribute.
*
* Provides the value of the attribute with the specified qualified name.
*
* Returns a string containing the value of the specified attribute, or NULL
* in case of error. The string must be deallocated by the caller.
*/
- (id) getAttribute:(NSString *) paramName{
xmlChar *attribute = xmlTextReaderGetAttribute(xmlReader, (xmlChar *)[paramName UTF8String]);

if(attribute != NULL){
NSString *rtString = [NSString stringWithUTF8String:(const char *)attribute];
free(attribute);
return rtString;
}
return NULL;
}

/**
* Checks if, the reader has reached to the end of file
* 'EOF' is not used as it is already defined in stdio.h
* as '#define EOF (-1)'
*/
- (BOOL) eof{
return xmlTextReaderReadState(xmlReader) == XML_TEXTREADER_MODE_EOF;
}

/**
* Initializing the xml stream reader with some uri
* or local path.
*/
- (id) initWithPath:(NSString *) path{
if(self = [super init]){
xmlReader = xmlNewTextReaderFilename([path UTF8String]);
if(xmlReader == NULL)
return nil;
}
return self;
}

/**
* @reader: the xmlTextReaderPtr used
*
* The local name of the node.
*
* Returns the local name or NULL if not available,
* if non NULL it need to be freed by the caller.
*/
- (NSString *) localName{
xmlChar *lclName = xmlTextReaderLocalName(xmlReader);

if(lclName != NULL){
NSString *rtString = [NSString stringWithUTF8String:(const char *)lclName];
free(lclName);
return rtString;
}
return NULL;
}

- (xmlElementType) nodeType{
return xmlTextReaderNodeType(xmlReader);
}

/**
* @reader: the xmlTextReaderPtr used
*
* Moves the position of the current instance to the next node in
* the stream, exposing its properties.
*
* Returns 1 if the node was read successfully, 0 if there is no more
* nodes to read, or -1 in case of error
*/
- (BOOL) read{
return xmlTextReaderRead(xmlReader);
}

/**
* @reader: the xmlTextReaderPtr used
*
* Reads the contents of an element or a text node as a Boolean.
*
* Returns a string containing the contents of the Element or Text node,
* or NULL if the reader is positioned on any other type of node.
* The string must be deallocated by the caller.
*/
- (void) readElementContentAsBoolean{
return [[self readElementContentAsString] boolValue];
}

/**
* @reader: the xmlTextReaderPtr used
*
* Reads the contents of an element or a text node as a string.
*
* Returns a string containing the contents of the Element or Text node,
* or NULL if the reader is positioned on any other type of node.
* The string must be deallocated by the caller.
*/
- (NSString *) readElementContentAsString{
xmlChar *content = xmlTextReaderReadString(xmlReader);

if(content != NULL){
NSString *rtString = [NSString stringWithUTF8String:(const char *)content];
free(content);
return rtString;
}
return NULL;
}

/**
* @reader: the xmlTextReaderPtr used
* @localName: the local name of the attribute.
* @namespaceURI: the namespace URI of the attribute.
*
* Moves the position of the current instance to the attribute with the
* specified local name and namespace URI.
*
* Returns 1 in case of success, -1 in case of error, 0 if not found
*/
- (int) readToFollowing:(NSString *) localname namespace:(NSString *) namespaceURI{
return xmlTextReaderMoveToAttributeNs(xmlReader, (xmlChar *)[localname UTF8String], (xmlChar *)[namespaceURI UTF8String]);
}

@end

的NSXMLParser包含在基金会,这可能满足您的需求。

你可以直接去使用libxml2的来源,以及它们的XmlReader API。 它是基于关闭在C#中,你似乎已经上面引用的API XmlReader中,但在C.

我意识到这不是Objective-C的,但你可以很容易地在这是由项目的其余部分访问的包装类的功能。

分类:iphone 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.354 (s). 10 q(s)