ic_selector.cpp
来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 203 行
CPP
203 行
/* * Copyright 2001,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. *//* * $Log: IC_Selector.cpp,v $ * Revision 1.7 2004/09/08 13:56:59 peiyongz * Apache License Version 2.0 * * Revision 1.6 2003/10/14 15:24:23 peiyongz * Implementation of Serialization/Deserialization * * Revision 1.5 2003/05/15 18:59:34 knoaman * Partial implementation of the configurable memory manager. * * Revision 1.4 2003/01/13 16:30:19 knoaman * [Bug 14469] Validator doesn't enforce xsd:key. * * Revision 1.3 2002/11/04 14:47:41 tng * C++ Namespace Support. * * Revision 1.2 2002/08/27 05:56:19 knoaman * Identity Constraint: handle case of recursive elements. * * Revision 1.1.1.1 2002/02/01 22:22:50 peiyongz * sane_include * * Revision 1.3 2001/11/23 18:35:33 tng * Eliminate Warning from AIX xlC 3.6:1540-399: (W) "XMLAttr" is undefined. The delete operator will not call a destructor. * * Revision 1.2 2001/11/15 17:10:19 knoaman * Particle derivation checking support. * * Revision 1.1 2001/11/02 14:08:40 knoaman * Add support for identity constraints. * */// ---------------------------------------------------------------------------// Includes// ---------------------------------------------------------------------------#include <xercesc/framework/XMLAttr.hpp>#include <xercesc/validators/schema/identity/IC_Selector.hpp>#include <xercesc/validators/schema/identity/XercesXPath.hpp>#include <xercesc/validators/schema/identity/IdentityConstraint.hpp>#include <xercesc/validators/schema/identity/FieldActivator.hpp>XERCES_CPP_NAMESPACE_BEGIN// ---------------------------------------------------------------------------// SelectorMatcher: Constructors and Destructor// ---------------------------------------------------------------------------SelectorMatcher::SelectorMatcher(XercesXPath* const xpath, IC_Selector* const selector, FieldActivator* const fieldActivator, const int initialDepth, MemoryManager* const manager) : XPathMatcher(xpath, selector->getIdentityConstraint(), manager) , fInitialDepth(initialDepth) , fElementDepth(0) , fMatchedDepth(-1) , fSelector(selector) , fFieldActivator(fieldActivator){}// ---------------------------------------------------------------------------// FieldMatcher: XMLDocumentHandler methods// ---------------------------------------------------------------------------void SelectorMatcher::startDocumentFragment() { XPathMatcher::startDocumentFragment(); fElementDepth = 0; fMatchedDepth = -1;}void SelectorMatcher::startElement(const XMLElementDecl& elemDecl, const unsigned int urlId, const XMLCh* const elemPrefix, const RefVectorOf<XMLAttr>& attrList, const unsigned int attrCount) { XPathMatcher::startElement(elemDecl, urlId, elemPrefix, attrList, attrCount); fElementDepth++; // activate the fields, if selector is matched int matched = isMatched(); if ((fMatchedDepth == -1 && ((matched & XP_MATCHED) == XP_MATCHED)) || ((matched & XP_MATCHED_D) == XP_MATCHED_D)) { IdentityConstraint* ic = fSelector->getIdentityConstraint(); int count = ic->getFieldCount(); fMatchedDepth = fElementDepth; fFieldActivator->startValueScopeFor(ic, fInitialDepth); for (int i = 0; i < count; i++) { XPathMatcher* matcher = fFieldActivator->activateField(ic->getFieldAt(i), fInitialDepth); matcher->startElement(elemDecl, urlId, elemPrefix, attrList, attrCount); } }}void SelectorMatcher::endElement(const XMLElementDecl& elemDecl, const XMLCh* const elemContent) { XPathMatcher::endElement(elemDecl, elemContent); if (fElementDepth-- == fMatchedDepth) { fMatchedDepth = -1; fFieldActivator->endValueScopeFor(fSelector->getIdentityConstraint(), fInitialDepth); }}// ---------------------------------------------------------------------------// IC_Selector: Constructors and Destructor// ---------------------------------------------------------------------------IC_Selector::IC_Selector(XercesXPath* const xpath, IdentityConstraint* const identityConstraint) : fXPath(xpath) , fIdentityConstraint(identityConstraint){}IC_Selector::~IC_Selector(){ delete fXPath;}// ---------------------------------------------------------------------------// IC_Selector: operators// ---------------------------------------------------------------------------bool IC_Selector::operator ==(const IC_Selector& other) const { return (*fXPath == *(other.fXPath));}bool IC_Selector::operator !=(const IC_Selector& other) const { return !operator==(other);}// ---------------------------------------------------------------------------// IC_Selector: Factory methods// ---------------------------------------------------------------------------XPathMatcher* IC_Selector::createMatcher(FieldActivator* const fieldActivator, const int initialDepth, MemoryManager* const manager) { return new (manager) SelectorMatcher(fXPath, this, fieldActivator, initialDepth, manager);}/*** * Support for Serialization/De-serialization ***/IMPL_XSERIALIZABLE_TOCREATE(IC_Selector)void IC_Selector::serialize(XSerializeEngine& serEng){ if (serEng.isStoring()) { serEng<<fXPath; IdentityConstraint::storeIC(serEng, fIdentityConstraint); } else { serEng>>fXPath; fIdentityConstraint = IdentityConstraint::loadIC(serEng); }}IC_Selector::IC_Selector(MemoryManager* const ):fXPath(0),fIdentityConstraint(0){}XERCES_CPP_NAMESPACE_END/** * End of file IC_Selector.cpp */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?