2011-01-13 8 views
4

Ich verwende XMLWriter zum Generieren der XML. Jetzt möchte ich dieses XML mit einigen Reader-Bibliothek/Framework lesen. Gibt es dazu einen ergänzenden Rahmen/eine Bibliothek?XMLStreamReader für Objective C iPhone?

Ich bin derzeit auf der Suche nach TouchXML-Bibliothek zu lesen, aber es funktioniert nicht in der erwarteten Weise, da es Stream-Lesen nicht unterstützt.

Ich möchte so etwas wie:

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; 
     } 
    } 

Antwort

1

Nachdem ich meinen eigenen Ruf im Wert von 50 verloren hatte, benutzte ich endlich libxml2 und machte meine XMLStreamReader-Klasse wie folgt, ich wünschte, ich hätte das früher finden können: P. Bitte beachten Sie, dass dies für die Nutzung brauchen wir libxml2.dylib inot unsere Frameworks und in den Build-Einstellungen umfassen füge -lxml2 in andere Linker-Flags und in Header-Suchpfade hinzufügen/usr/include/libxml2

Die Header-Datei:

#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 

Die Implementierungsdatei:

#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 
0

NSXMLParser wird in Stiftung enthalten, die Ihren Anforderungen entsprechen kann.

+1

Bitte meine Frage aktualisiert sehen. Vielen Dank für die Eingabe –

0

Mit libxml2 und ihrer XmlReader API können Sie direkt zur Quelle gehen. Es basiert auf der XmlReader-API in C#, auf die Sie oben verwiesen zu haben scheinen, aber in C.

Ich weiß, dass es nicht objective-c ist, aber Sie könnten die Funktionalität problemlos in eine Klasse einbinden, auf die der Rest Ihres Projekts zugreift .

+0

Hallo BobDevil .. große Eingabe +1 dafür aber madhup hat den Code auch hinzugefügt. Also habe ich seine Antwort markiert –