topical media & game development

talk show tell print

#mobile-application-10-DerbyApp-build-iphone-Classes-GDataXMLNode.h / h



  /* Copyright (c) 2008 Google Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  if defined(USE_TI_XML) || defined(USE_TI_NETWORK)
  
  // These node, element, and document classes implement a subset of the methods
  // provided by NSXML.  While NSXML behavior is mimicked as much as possible,
  // there are important differences.
  //
  // The biggest difference is that, since this is based on libxml2, there
  // is no retain model for the underlying node data.  Rather than copy every
  // node obtained from a parse tree (which would have a substantial memory
  // impact), we rely on weak references, and it is up to the code that
  // created a document to retain it for as long as any
  // references rely on nodes inside that document tree.
  
  #import <Foundation/Foundation.h>
  
  // libxml includes require that the target Header Search Paths contain
  //
  //   /usr/include/libxml2
  //
  // and Other Linker Flags contain
  //
  //   -lxml2
  
  #import <libxml/tree.h>
  #import <libxml/parser.h>
  #import <libxml/xmlstring.h>
  #import <libxml/xpath.h>
  #import <libxml/xpathInternals.h>
  
  if (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4) || defined(GDATA_TARGET_NAMESPACE)
  // we need NSInteger for the 10.4 SDK, or we're using target namespace macros
  #import <GDataDefines.h>
  endif
  
  #undef _EXTERN
  #undef _INITIALIZE_AS
  ifdef GDATAXMLNODE_DEFINE_GLOBALS
  define _EXTERN
  define _INITIALIZE_AS(x) =x
  else
  define _EXTERN extern
  define _INITIALIZE_AS(x)
  endif
  
  // when no namespace dictionary is supplied for XPath, the default namespace
  // for the evaluated tree is registered with the prefix _def_ns
  _EXTERN const char* kGDataXMLXPathDefaultNamespacePrefix _INITIALIZE_AS("_def_ns");
  
  // Nomenclature for method names:
  //
  // Node = GData node
  // XMLNode = xmlNodePtr
  //
  // So, for example:
  //  + (id)nodeConsumingXMLNode:(xmlNodePtr)theXMLNode;
  
   NSDictionary, NSError, NSString, NSURL;
   GDataXMLDocument;
  
  enum {
          GDataXMLInvalidKind = 0,
          GDataXMLDocumentKind,
          GDataXMLElementKind,
          GDataXMLAttributeKind,
          GDataXMLNamespaceKind,
          GDataXMLProcessingInstructionKind,
          GDataXMLCommentKind,
          GDataXMLTextKind,
          GDataXMLDTDKind,
          GDataXMLEntityDeclarationKind,
          GDataXMLAttributeDeclarationKind,
          GDataXMLElementDeclarationKind,
          GDataXMLNotationDeclarationKind
  };
  
  typedef NSUInteger GDataXMLNodeKind;
  
  @interface GDataXMLNode : NSObject {
  @protected
          // NSXMLNodes can have a namespace URI or prefix even if not part
          // of a tree; xmlNodes cannot.  When we create nodes apart from
          // a tree, we'll store the dangling prefix or URI in the xmlNode's name,
          // like
          //   "prefix:name"
          // or
          //   "{http://uri}:name"
          //
          // We will fix up the node's namespace and name (and those of any children)
          // later when adding the node to a tree with addChild: or addAttribute:.
          // See fixUpNamespacesForNode:.
          
          xmlNodePtr xmlNode_; // may also be an xmlAttrPtr or xmlNsPtr
          BOOL shouldFreeXMLNode_; // if yes, xmlNode_ will be free'd in dealloc
          
          // cached values
          NSString *cachedName_;
          NSArray *cachedChildren_;
          NSArray *cachedAttributes_;
  }
  
  + (GDataXMLElement *)elementWithName:(NSString *)name;
  + (GDataXMLElement *)elementWithName:(NSString *)name stringValue:(NSString *)value;
  + (GDataXMLElement *)elementWithName:(NSString *)name URI:(NSString *)value;
  
  + (id)attributeWithName:(NSString *)name stringValue:(NSString *)value;
  + (id)attributeWithName:(NSString *)name URI:(NSString *)attributeURI stringValue:(NSString *)value;
  
  + (id)namespaceWithName:(NSString *)name stringValue:(NSString *)value;
  
  + (id)textWithStringValue:(NSString *)value;
  
  (NSString *)stringValue;
  (void)setStringValue:(NSString *)str;
  
  (NSUInteger)childCount;
  (NSArray *)children;
  (GDataXMLNode *)childAtIndex:(unsigned)index;
  
  (NSString *)localName;
  (NSString *)name;
  (NSString *)prefix;
  (NSString *)URI;
  
  (GDataXMLNodeKind)kind;
  
  (NSString *)XMLString;
  
  + (NSString *)localNameForName:(NSString *)name;
  + (NSString *)prefixForName:(NSString *)name;
  
  // This is the preferred entry point for nodesForXPath.  This takes an explicit
  // namespace dictionary (keys are prefixes, values are URIs).
  (NSArray *)nodesForXPath:(NSString *)xpath namespaces:(NSDictionary *)namespaces error:(NSError **)error;
  
  // This implementation of nodesForXPath registers namespaces only from the
  // document's root node.  _def_ns may be used as a prefix for the default
  // namespace, though there's no guarantee that the default namespace will
  // be consistenly the same namespace in server responses.
  (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error;
  
  // access to the underlying libxml node; be sure to release the cached values
  // if you change the underlying tree at all
  (xmlNodePtr)XMLNode;
  (void)releaseCachedValues;
  
  + (id)nodeBorrowingXMLNode:(xmlNodePtr)theXMLNode;
  
  @end
  
  @interface GDataXMLElement : GDataXMLNode
  
  (id)initWithXMLString:(NSString *)str error:(NSError **)error;
  
  (NSArray *)namespaces;
  (void)setNamespaces:(NSArray *)namespaces;
  (void)addNamespace:(GDataXMLNode *)aNamespace;
  
  (void)addChild:(GDataXMLNode *)child;
  (void)removeChild:(GDataXMLNode *)child;
  
  (NSArray *)elementsForName:(NSString *)name;
  (NSArray *)elementsForLocalName:(NSString *)localName URI:(NSString *)URI;
  
  (NSArray *)attributes;
  (GDataXMLNode *)attributeForName:(NSString *)name;
  (GDataXMLNode *)attributeForLocalName:(NSString *)name URI:(NSString *)attributeURI;
  (void)addAttribute:(GDataXMLNode *)attribute;
  
  (NSString *)resolvePrefixForNamespaceURI:(NSString *)namespaceURI;
  
  @end
  
  @interface GDataXMLDocument : NSObject {
  @protected
          xmlDoc* xmlDoc_; // strong; always free'd in dealloc
  }
  
  (id)initWithXMLString:(NSString *)str options:(unsigned int)mask error:(NSError **)error;
  (id)initWithData:(NSData *)data options:(unsigned int)mask error:(NSError **)error;
  (id)initWithRootElement:(GDataXMLElement *)element;
  (id)initWithDocument:(xmlDocPtr)xml;
  
  (GDataXMLElement *)rootElement;
  
  (NSData *)XMLData;
  
  (void)setVersion:(NSString *)version;
  (void)setCharacterEncoding:(NSString *)encoding;
  
  // This is the preferred entry point for nodesForXPath.  This takes an explicit
  // namespace dictionary (keys are prefixes, values are URIs).
  (NSArray *)nodesForXPath:(NSString *)xpath namespaces:(NSDictionary *)namespaces error:(NSError **)error;
  
  // This implementation of nodesForXPath registers namespaces only from the
  // document's root node.  _def_ns may be used as a prefix for the default
  // namespace, though there's no guarantee that the default namespace will
  // be consistenly the same namespace in server responses.
  (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error;
  
  (NSString *)description;
  @end
  
  endif


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.