diff options
author | coopercc <coopercc> | 2000-09-25 00:58:47 +0000 |
---|---|---|
committer | coopercc <coopercc> | 2000-09-25 00:58:47 +0000 |
commit | aac56e404126bdd5a5a69f2adc07cd7861f8e10e (patch) | |
tree | 08ea233fce905d0dcf4281f473b58344fa5aa8ea | |
parent | 88e345d65955fb82aeaabc5e42ed97f7fb5de40b (diff) | |
download | libexpat-aac56e404126bdd5a5a69f2adc07cd7861f8e10e.tar.gz |
Changes for namespace triplets.
-rw-r--r-- | doc/reference.html | 30 | ||||
-rw-r--r-- | lib/expat.h | 19 | ||||
-rw-r--r-- | lib/xmlparse.c | 20 |
3 files changed, 65 insertions, 4 deletions
diff --git a/doc/reference.html b/doc/reference.html index 59e4390..d848ab1 100644 --- a/doc/reference.html +++ b/doc/reference.html @@ -389,8 +389,8 @@ namespace declaration handlers with <code>XML_SetNamespaceDeclHandler</code></a>. <p>Element type and attribute names that belong to a given namespace are -passed to the appropriate handler in expanded form. This expanded form -is a concatenation of the namespace URI, the separator character (which +passed to the appropriate handler in expanded form. By default this expanded +form is a concatenation of the namespace URI, the separator character (which is the 2nd argument to <code>XML_ParserCreateNS</code>), and the local name (i.e. the part after the colon). Names with undeclared prefixes are passed through to the handlers unchanged, with the prefix and colon still @@ -398,6 +398,12 @@ attached. Unprefixed attribute names are never expanded, and unprefixed element names are only expanded when they are in the scope of a default namespace. +<p>However if <a href="XML_SetReturnNSTriplet">XML_SetReturnNSTriplet</a> +has been called with a non-zero <code>do_nst</code> parameter, then the +expanded form for names with an explicit prefix is a concatenation of: +URI, separator, local name, separator, prefix. +</p> + <p>You can set handlers for the start of a namespace declaration and for the end of a scope of a declaration with the <code>XML_SetNamespaceDeclHandler</code> function. @@ -1435,5 +1441,25 @@ The choices for <code>code</code> are: </ul> </div> +<div class="fcndec"><a name="XML_SetReturnNSTriplet"><pre> +void +XML_SetReturnNSTriplet(XML_Parser parser, + int do_nst); +</pre></a></div> +<div class="fcndef"> +<p> +This function only has an effect when using a parser created with +<a href="#XML_ParserCreateNS">XML_ParserCreateNS</a>, i.e. when namespace +processing is in effect. The <code>do_nst</code> sets whether or not prefixes +are returned with names qualified with a namespace prefix. If this function +is called with <code>do_nst</code> non-zero, then afterwards namespace +qualified names (that is qualified with a prefix as opposed to belonging +to a default namespace) are returned as a triplet with the three parts +separated by the namespace separator specified when the parser was created. +The order of returned parts is URI, local name, and prefix.</p> +<p>If <code>do_nst</code> is zero, then namespaces are reported in the +default manner, URI then local_name separated by the namespace separator.</p> +</div> + </body> </html> diff --git a/lib/expat.h b/lib/expat.h index 612c6a7..49be3ee 100644 --- a/lib/expat.h +++ b/lib/expat.h @@ -167,6 +167,7 @@ typedef void (*XML_StartElementHandler)(void *userData, typedef void (*XML_EndElementHandler)(void *userData, const XML_Char *name); + /* s is not 0 terminated. */ typedef void (*XML_CharacterDataHandler)(void *userData, const XML_Char *s, @@ -389,10 +390,10 @@ XML_SetElementHandler(XML_Parser parser, XML_EndElementHandler end); void -XML_SetStartElementHandler(XML_Parser parser, XML_StartElementHandler); +XML_SetStartElementHandler(XML_Parser, XML_StartElementHandler); void -XML_SetEndElementHandler(XML_Parser parser, XML_EndElementHandler); +XML_SetEndElementHandler(XML_Parser, XML_EndElementHandler); void XML_SetCharacterDataHandler(XML_Parser parser, @@ -490,6 +491,20 @@ processing instruction or character data. It causes the corresponding markup to be passed to the default handler. */ void XML_DefaultCurrent(XML_Parser parser); +/* If do_nst is non-zero, and namespace processing is in effect, and + a name has a prefix (i.e. an explicit namespace qualifier) then + that name is returned as a triplet in a single + string separated by the separator character specified when the parser + was created: URI + sep + local_name + sep + prefix. + + If do_nst is zero, then namespace information is returned in the + default manner (URI + sep + local_name) whether or not the names + has a prefix. +*/ + +void +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); + /* This value is passed as the userData argument to callbacks. */ void XML_SetUserData(XML_Parser parser, void *userData); diff --git a/lib/xmlparse.c b/lib/xmlparse.c index 340d045..55f2e51 100644 --- a/lib/xmlparse.c +++ b/lib/xmlparse.c @@ -362,6 +362,7 @@ typedef struct { const ENCODING *m_internalEncoding; const XML_Char *m_protocolEncodingName; int m_ns; + int m_ns_triplets; void *m_unknownEncodingMem; void *m_unknownEncodingData; void *m_unknownEncodingHandlerData; @@ -447,6 +448,7 @@ typedef struct { #define unknownEncodingRelease (((Parser *)parser)->m_unknownEncodingRelease) #define protocolEncodingName (((Parser *)parser)->m_protocolEncodingName) #define ns (((Parser *)parser)->m_ns) +#define ns_triplets (((Parser *)parser)->m_ns_triplets) #define prologState (((Parser *)parser)->m_prologState) #define processor (((Parser *)parser)->m_processor) #define errorCode (((Parser *)parser)->m_errorCode) @@ -627,6 +629,7 @@ XML_ParserCreate_MM(const XML_Char *encodingName, paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; #endif ns = 0; + ns_triplets = 0; poolInit(&tempPool, &(((Parser *) parser)->m_mem)); poolInit(&temp2Pool, &(((Parser *) parser)->m_mem)); protocolEncodingName = encodingName ? poolCopyString(&tempPool, encodingName) : 0; @@ -695,6 +698,7 @@ XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser, XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; ELEMENT_TYPE * oldDeclElementType = declElementType; + void *oldUserData = userData; void *oldHandlerArg = handlerArg; int oldDefaultExpandInternalEntities = defaultExpandInternalEntities; @@ -702,6 +706,7 @@ XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser, #ifdef XML_DTD int oldParamEntityParsing = paramEntityParsing; #endif + int oldns_triplets = ns_triplets; if (ns) { XML_Char tmp[2]; @@ -746,6 +751,7 @@ XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser, if (oldExternalEntityRefHandlerArg != oldParser) externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; defaultExpandInternalEntities = oldDefaultExpandInternalEntities; + ns_triplets = oldns_triplets; #ifdef XML_DTD paramEntityParsing = oldParamEntityParsing; if (context) { @@ -827,6 +833,11 @@ void XML_UseParserAsHandlerArg(XML_Parser parser) handlerArg = parser; } +void +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) { + ns_triplets = do_nst; +} + void XML_SetUserData(XML_Parser parser, void *p) { if (handlerArg == userData) @@ -1985,6 +1996,15 @@ static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc, if (!poolAppendChar(&tempPool, *s)) return XML_ERROR_NO_MEMORY; } while (*s++); + if (ns_triplets) { + tempPool.ptr[-1] = namespaceSeparator; + s = b->prefix->name; + do { + if (!poolAppendChar(&tempPool, *s)) + return XML_ERROR_NO_MEMORY; + } while (*s++); + } + appAtts[i] = poolStart(&tempPool); poolFinish(&tempPool); } |