问题描述
我正在使用 XMLWriter 来生成xml.现在,我想使用一些阅读器库/框架来阅读此xml.有没有补充的框架/库.
I am using XMLWriter for generating the xml. Now I want to read this xml with some Reader library/framework. Is there any complementary framework/library available for this.
我目前正在寻找使用TouchXML库来读取它,但是由于它不支持流读取,因此它不能以预期的方式工作.
I am currently looking to use TouchXML library to read this, but its not working in the expected way as it does not support stream reading.
我想做类似的事情:
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
After loosing my own reputation worth 50, I finally used libxml2 and made my XMLStreamReader class as following, I wish I could have found this earlier :P. Please note that for using this we need include libxml2.dylib inot our frameworks and in the build settings do add -lxml2
into other linker flags and in header search paths add /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
这篇关于适用于Objective C iPhone的XMLStreamReader?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!