/* * Copyright 2002, 2003,2004 The Apache Software Foundation. * * 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. */ /** * This file contains code to build the DOM tree. It registers a document * handler with the scanner. In these handler methods, appropriate DOM nodes * are created and added to the DOM tree. * * $Id: DOMBuilderImpl.cpp 191708 2005-06-21 19:02:15Z cargilld $ * */ // --------------------------------------------------------------------------- // Includes // --------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include XERCES_CPP_NAMESPACE_BEGIN // --------------------------------------------------------------------------- // DOMBuilderImpl: Constructors and Destructor // --------------------------------------------------------------------------- DOMBuilderImpl::DOMBuilderImpl( XMLValidator* const valToAdopt , MemoryManager* const manager , XMLGrammarPool* const gramPool) : AbstractDOMParser(valToAdopt, manager, gramPool) , fAutoValidation(false) , fValidation(false) , fEntityResolver(0) , fXMLEntityResolver(0) , fErrorHandler(0) , fFilter(0) , fCharsetOverridesXMLEncoding(true) , fUserAdoptsDocument(false) { // dom spec has different default from scanner's default, so set explicitly getScanner()->setNormalizeData(false); } DOMBuilderImpl::~DOMBuilderImpl() { } // --------------------------------------------------------------------------- // DOMBuilderImpl: Setter methods // --------------------------------------------------------------------------- void DOMBuilderImpl::setErrorHandler(DOMErrorHandler* const handler) { fErrorHandler = handler; if (fErrorHandler) { getScanner()->setErrorReporter(this); } else { getScanner()->setErrorReporter(0); } } void DOMBuilderImpl::setEntityResolver(DOMEntityResolver* const handler) { fEntityResolver = handler; if (fEntityResolver) { getScanner()->setEntityHandler(this); fXMLEntityResolver = 0; } else { getScanner()->setEntityHandler(0); } } void DOMBuilderImpl::setXMLEntityResolver(XMLEntityResolver* const handler) { fXMLEntityResolver = handler; if (fXMLEntityResolver) { getScanner()->setEntityHandler(this); fEntityResolver = 0; } else { getScanner()->setEntityHandler(0); } } void DOMBuilderImpl::setFilter(DOMBuilderFilter* const) { throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, getMemoryManager()); } // --------------------------------------------------------------------------- // DOMBuilderImpl: Feature methods // --------------------------------------------------------------------------- void DOMBuilderImpl::setFeature(const XMLCh* const name, const bool state) { if (XMLString::compareIStringASCII(name, XMLUni::fgDOMEntities) == 0) { setCreateEntityReferenceNodes(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMComments) == 0) { setCreateCommentNodes(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMDatatypeNormalization) == 0) { getScanner()->setNormalizeData(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMNamespaces) == 0) { setDoNamespaces(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) { setIncludeIgnorableWhitespace(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMValidation) == 0) { fValidation = state; if (state) { if (getValidationScheme() == AbstractDOMParser::Val_Never) setValidationScheme(AbstractDOMParser::Val_Always); } else { setValidationScheme(AbstractDOMParser::Val_Never); } } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMValidateIfSchema) == 0) { fAutoValidation = state; if (state) { setValidationScheme(AbstractDOMParser::Val_Auto); } else { setValidationScheme(AbstractDOMParser::Val_Never); } } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) { // in fact, setting this has no effect to the parser fCharsetOverridesXMLEncoding = state; } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 || XMLString::compareIStringASCII(name, XMLUni::fgDOMInfoset) == 0 || XMLString::compareIStringASCII(name, XMLUni::fgDOMCanonicalForm) == 0 ) { if (state) throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, getMemoryManager()); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMNamespaceDeclarations) == 0 || XMLString::compareIStringASCII(name, XMLUni::fgDOMCDATASections) == 0 ) { if (!state) throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, getMemoryManager()); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSchema) == 0) { setDoSchema(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSchemaFullChecking) == 0) { setValidationSchemaFullChecking(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesUserAdoptsDOMDocument) == 0) { if(state) fUserAdoptsDocument = true; else fUserAdoptsDocument = false; } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesLoadExternalDTD) == 0) { setLoadExternalDTD(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesContinueAfterFatalError) == 0) { setExitOnFirstFatalError(!state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesValidationErrorAsFatal) == 0) { setValidationConstraintFatal(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesCacheGrammarFromParse) == 0) { getScanner()->cacheGrammarFromParse(state); if (state) getScanner()->useCachedGrammarInParse(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0) { if (state || !getScanner()->isCachingGrammarFromParse()) getScanner()->useCachedGrammarInParse(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesCalculateSrcOfs) == 0) { getScanner()->setCalculateSrcOfs(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesStandardUriConformant) == 0) { getScanner()->setStandardUriConformant(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesDOMHasPSVIInfo) == 0) { setCreateSchemaInfo(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesGenerateSyntheticAnnotations) == 0) { getScanner()->setGenerateSyntheticAnnotations(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesValidateAnnotations) == 0) { getScanner()->setValidateAnnotations(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesIdentityConstraintChecking) == 0) { getScanner()->setIdentityConstraintChecking(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesIgnoreCachedDTD) == 0) { getScanner()->setIgnoredCachedDTD(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesIgnoreAnnotations) == 0) { getScanner()->setIgnoreAnnotations(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesDisableDefaultEntityResolution) == 0) { getScanner()->setDisableDefaultEntityResolution(state); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSkipDTDValidation) == 0) { getScanner()->setSkipDTDValidation(state); } else { throw DOMException(DOMException::NOT_FOUND_ERR, 0, getMemoryManager()); } } bool DOMBuilderImpl::getFeature(const XMLCh* const name) const { if (XMLString::compareIStringASCII(name, XMLUni::fgDOMEntities) == 0) { return getCreateEntityReferenceNodes(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMComments) == 0) { return getCreateCommentNodes(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMDatatypeNormalization) == 0) { return getScanner()->getNormalizeData(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMNamespaces) == 0) { return getDoNamespaces(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) { return getIncludeIgnorableWhitespace(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMValidation) == 0) { return fValidation; } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMValidateIfSchema) == 0) { return fAutoValidation; } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) { return fCharsetOverridesXMLEncoding; } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 || XMLString::compareIStringASCII(name, XMLUni::fgDOMInfoset) == 0 || XMLString::compareIStringASCII(name, XMLUni::fgDOMCanonicalForm) == 0 ) { return false; } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMNamespaceDeclarations) == 0 || XMLString::compareIStringASCII(name, XMLUni::fgDOMCDATASections) == 0 ) { return true; } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSchema) == 0) { return getDoSchema(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSchemaFullChecking) == 0) { return getValidationSchemaFullChecking(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesIdentityConstraintChecking) == 0) { return getIdentityConstraintChecking(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesLoadExternalDTD) == 0) { return getLoadExternalDTD(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesContinueAfterFatalError) == 0) { return !getExitOnFirstFatalError(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesValidationErrorAsFatal) == 0) { return getValidationConstraintFatal(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesCacheGrammarFromParse) == 0) { return getScanner()->isCachingGrammarFromParse(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0) { return getScanner()->isUsingCachedGrammarInParse(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesCalculateSrcOfs) == 0) { return getScanner()->getCalculateSrcOfs(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesStandardUriConformant) == 0) { return getScanner()->getStandardUriConformant(); } else if(XMLString::compareIStringASCII(name, XMLUni::fgXercesUserAdoptsDOMDocument) == 0) { return fUserAdoptsDocument; } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesDOMHasPSVIInfo) == 0) { return getCreateSchemaInfo(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesGenerateSyntheticAnnotations) == 0) { return getScanner()->getGenerateSyntheticAnnotations(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesValidateAnnotations) == 0) { return getScanner()->getValidateAnnotations(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesIgnoreCachedDTD) == 0) { return getScanner()->getIgnoreCachedDTD(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesIgnoreAnnotations) == 0) { return getScanner()->getIgnoreAnnotations(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesDisableDefaultEntityResolution) == 0) { return getScanner()->getDisableDefaultEntityResolution(); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSkipDTDValidation) == 0) { return getScanner()->getSkipDTDValidation(); } else { throw DOMException(DOMException::NOT_FOUND_ERR, 0, getMemoryManager()); } return false; } bool DOMBuilderImpl::canSetFeature(const XMLCh* const name, const bool state) const { if ((XMLString::compareIStringASCII(name, XMLUni::fgDOMEntities) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgDOMComments) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgDOMDatatypeNormalization) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgDOMNamespaces) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgDOMValidation) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgDOMValidateIfSchema) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesUserAdoptsDOMDocument) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesCalculateSrcOfs) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesStandardUriConformant) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesDOMHasPSVIInfo) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesValidateAnnotations) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesGenerateSyntheticAnnotations) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesIdentityConstraintChecking) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesIgnoreCachedDTD) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesIgnoreAnnotations) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesDisableDefaultEntityResolution) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesSkipDTDValidation) == 0) ) { return true; } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 || XMLString::compareIStringASCII(name, XMLUni::fgDOMInfoset) == 0 || XMLString::compareIStringASCII(name, XMLUni::fgDOMCanonicalForm) == 0 ) { if (!state) return true; } else if (XMLString::compareIStringASCII(name, XMLUni::fgDOMNamespaceDeclarations) == 0 || XMLString::compareIStringASCII(name, XMLUni::fgDOMCDATASections) == 0 ) { if (state) return true; } else if ((XMLString::compareIStringASCII(name, XMLUni::fgXercesSchema) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesSchemaFullChecking) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesLoadExternalDTD) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesContinueAfterFatalError) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesValidationErrorAsFatal) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesCacheGrammarFromParse) == 0) || (XMLString::compareIStringASCII(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0)) { return true; } return false; } // --------------------------------------------------------------------------- // DOMBuilderImpl: Non standard extension // --------------------------------------------------------------------------- void DOMBuilderImpl::setProperty(const XMLCh* const name, void* value) { if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSchemaExternalSchemaLocation) == 0) { setExternalSchemaLocation((XMLCh*)value); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0) { setExternalNoNamespaceSchemaLocation((XMLCh*)value); } else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSecurityManager) == 0) { setSecurityManager((SecurityManager*)value); } else if (XMLString::equals(name, XMLUni::fgXercesScannerName)) { AbstractDOMParser::useScanner((const XMLCh*) value); } else if (XMLString::equals(name, XMLUni::fgXercesParserUseDocumentFromImplementation)) { useImplementation((const XMLCh*) value); } else throw DOMException(DOMException::NOT_FOUND_ERR, 0, getMemoryManager()); } void* DOMBuilderImpl::getProperty(const XMLCh* const name) const { if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSchemaExternalSchemaLocation) == 0) return (void*)getExternalSchemaLocation(); else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0) return (void*)getExternalNoNamespaceSchemaLocation(); else if (XMLString::compareIStringASCII(name, XMLUni::fgXercesSecurityManager) == 0) return (void*)getSecurityManager(); else throw DOMException(DOMException::NOT_FOUND_ERR, 0, getMemoryManager()); return 0; } void DOMBuilderImpl::release() { DOMBuilderImpl* builder = (DOMBuilderImpl*) this; delete builder; } void DOMBuilderImpl::resetDocumentPool() { resetPool(); } // --------------------------------------------------------------------------- // DOMBuilderImpl: Parsing methods // --------------------------------------------------------------------------- DOMDocument* DOMBuilderImpl::parse(const DOMInputSource& source) { Wrapper4DOMInputSource isWrapper((DOMInputSource*) &source, false, getMemoryManager()); AbstractDOMParser::parse(isWrapper); if (fUserAdoptsDocument) return adoptDocument(); else return getDocument(); } DOMDocument* DOMBuilderImpl::parseURI(const XMLCh* const systemId) { AbstractDOMParser::parse(systemId); if (fUserAdoptsDocument) return adoptDocument(); else return getDocument(); } DOMDocument* DOMBuilderImpl::parseURI(const char* const systemId) { AbstractDOMParser::parse(systemId); if (fUserAdoptsDocument) return adoptDocument(); else return getDocument(); } void DOMBuilderImpl::parseWithContext(const DOMInputSource&, DOMNode* const, const short) { throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, getMemoryManager()); } // --------------------------------------------------------------------------- // DOMBuilderImpl: Implementation of the XMLErrorReporter interface // --------------------------------------------------------------------------- void DOMBuilderImpl::error( const unsigned int code , const XMLCh* const , const XMLErrorReporter::ErrTypes errType , const XMLCh* const errorText , const XMLCh* const systemId , const XMLCh* const , const XMLSSize_t lineNum , const XMLSSize_t colNum) { if (fErrorHandler) { short severity = DOMError::DOM_SEVERITY_ERROR; if (errType == XMLErrorReporter::ErrType_Warning) severity = DOMError::DOM_SEVERITY_WARNING; else if (errType == XMLErrorReporter::ErrType_Fatal) severity = DOMError::DOM_SEVERITY_FATAL_ERROR; DOMLocatorImpl location((int)lineNum, (int) colNum, getCurrentNode(), systemId); DOMErrorImpl domError(severity, errorText, &location); // if user return false, we should stop the process, so throw an error if (!fErrorHandler->handleError(domError) && !getScanner()->getInException()) throw (XMLErrs::Codes) code; } } void DOMBuilderImpl::resetErrors() { } // --------------------------------------------------------------------------- // DOMBuilderImpl: Implementation of XMLEntityHandler interface // --------------------------------------------------------------------------- InputSource* DOMBuilderImpl::resolveEntity(const XMLCh* const publicId, const XMLCh* const systemId, const XMLCh* const baseURI) { // // Just map it to the SAX entity resolver. If there is not one installed, // return a null pointer to cause the default resolution. // if (fEntityResolver) { DOMInputSource* is = fEntityResolver->resolveEntity(publicId, systemId, baseURI); if (is) return new (getMemoryManager()) Wrapper4DOMInputSource(is, true, getMemoryManager()); } return 0; } InputSource* DOMBuilderImpl::resolveEntity( XMLResourceIdentifier* resourceIdentifier ) { // // Just map it to the SAX entity resolver. If there is not one installed, // return a null pointer to cause the default resolution. // if (fEntityResolver) { DOMInputSource* is = fEntityResolver->resolveEntity(resourceIdentifier->getPublicId(), resourceIdentifier->getSystemId(), resourceIdentifier->getBaseURI()); if (is) return new (getMemoryManager()) Wrapper4DOMInputSource(is, true, getMemoryManager()); } if (fXMLEntityResolver) { return(fXMLEntityResolver->resolveEntity(resourceIdentifier)); } return 0; } typedef JanitorMemFunCall ResetParseType; // --------------------------------------------------------------------------- // DOMBuilderImpl: Grammar preparsing methods // --------------------------------------------------------------------------- Grammar* DOMBuilderImpl::loadGrammar(const char* const systemId, const short grammarType, const bool toCache) { // Avoid multiple entrance if (getParseInProgress()) ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager); ResetParseType resetParse(this, &DOMBuilderImpl::resetParse); Grammar* grammar = 0; try { setParseInProgress(true); if (grammarType == Grammar::DTDGrammarType) getScanner()->setDocTypeHandler(0); grammar = getScanner()->loadGrammar(systemId, grammarType, toCache); // Release DOM tree - DTD DOMDocument* doc = adoptDocument(); if (doc) doc->release(); } catch(const OutOfMemoryException&) { resetParse.release(); throw; } return grammar; } Grammar* DOMBuilderImpl::loadGrammar(const XMLCh* const systemId, const short grammarType, const bool toCache) { // Avoid multiple entrance if (getParseInProgress()) ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager); ResetParseType resetParse(this, &DOMBuilderImpl::resetParse); Grammar* grammar = 0; try { setParseInProgress(true); if (grammarType == Grammar::DTDGrammarType) getScanner()->setDocTypeHandler(0); grammar = getScanner()->loadGrammar(systemId, grammarType, toCache); // Release DOM tree - DTD DOMDocument* doc = adoptDocument(); if (doc) doc->release(); } catch(const OutOfMemoryException&) { resetParse.release(); throw; } return grammar; } Grammar* DOMBuilderImpl::loadGrammar(const DOMInputSource& source, const short grammarType, const bool toCache) { // Avoid multiple entrance if (getParseInProgress()) ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager); ResetParseType resetParse(this, &DOMBuilderImpl::resetParse); Grammar* grammar = 0; try { Wrapper4DOMInputSource isWrapper((DOMInputSource*) &source, false, getMemoryManager()); setParseInProgress(true); if (grammarType == Grammar::DTDGrammarType) getScanner()->setDocTypeHandler(0); grammar = getScanner()->loadGrammar(isWrapper, grammarType, toCache); // Release DOM tree - DTD DOMDocument* doc = adoptDocument(); if (doc) doc->release(); } catch(const OutOfMemoryException&) { resetParse.release(); throw; } return grammar; } void DOMBuilderImpl::resetCachedGrammarPool() { getGrammarResolver()->resetCachedGrammar(); } void DOMBuilderImpl::resetParse() { if (getScanner()->getDocTypeHandler() == 0) { getScanner()->setDocTypeHandler(this); } setParseInProgress(false); } Grammar* DOMBuilderImpl::getGrammar(const XMLCh* const nameSpaceKey) const { return getGrammarResolver()->getGrammar(nameSpaceKey); } Grammar* DOMBuilderImpl::getRootGrammar() const { return getScanner()->getRootGrammar(); } const XMLCh* DOMBuilderImpl::getURIText(unsigned int uriId) const { return getScanner()->getURIText(uriId); } unsigned int DOMBuilderImpl::getSrcOffset() const { return getScanner()->getSrcOffset(); } XERCES_CPP_NAMESPACE_END