/** * Get this AttributeMap in sync with the given "defaults" map. * @param defaults The default attributes map to sync with. */ void DOMAttrMapImpl::reconcileDefaultAttributes(const DOMAttrMapImpl* defaults) { // remove any existing default XMLSize_t nsize = getLength(); for (XMLSSize_t i = nsize - 1; i >= 0; i--) { DOMAttr* attr = (DOMAttr*)item(i); if (!attr->getSpecified()) { removeNamedItemAt(i); } } hasDefaults(false); // add the new defaults if (defaults) { hasDefaults(true); if (nsize == 0) { cloneContent(defaults); } else { XMLSize_t dsize = defaults->getLength(); for (XMLSize_t n = 0; n < dsize; n++) { DOMAttr* attr = (DOMAttr*)defaults->item(n); DOMAttr* newAttr = (DOMAttr*)attr->cloneNode(true); setNamedItemNS(newAttr); DOMAttrImpl* newAttrImpl = (DOMAttrImpl*) newAttr; newAttrImpl->setSpecified(false); } } } } // reconcileDefaults()
const char *SkinElementsMgr::getElementAlias(const char *id) { if(m_doc) { DOMElement * node = m_doc->getElementById(id); if (node && !STRCMP(node->getNodeName(),"elementalias")) { DOMAttr * attr = node->getAttributeNode("target"); if( attr && attr->getSpecified() ) return attr->getValue(); } } return NULL; }
/** * Move specified attributes from the given map to this one */ void DOMAttrMapImpl::moveSpecifiedAttributes(DOMAttrMapImpl* srcmap) { XMLSize_t nsize = srcmap->getLength(); for (XMLSSize_t i = nsize - 1; i >= 0; i--) { DOMAttr* attr = (DOMAttr*)srcmap->item(i); if (attr->getSpecified()) { srcmap->removeNamedItemAt(i); } if (attr->getLocalName()) setNamedItemNS(attr); else setNamedItem(attr); } } // moveSpecifiedAttributes(AttributeMap):void
void XmlSchemaGenerator::generateData ( const wxString &elementName, size_t nIndent /*= 0*/) { ElmtData &data = mElements[elementName]; std::set<const DOMElement *>::iterator elmtItr; data.name = elementName; //Content std::map<wxString, ChildData> &childMap = data.children; std::map<wxString, ChildData>::iterator itr; std::set<wxString> previous; elmtItr = data.nodes.begin(); for ( ; elmtItr != data.nodes.end(); ++elmtItr ) { previous.clear(); std::map<wxString, size_t> countMap; DOMElement *child = ( **elmtItr ).getFirstElementChild(); for ( ; child != NULL; child = child->getNextElementSibling() ) { wxString name = WrapXerces::toString ( child->getTagName() ); childMap[name].prevSiblings.insert ( previous.begin(), previous.end() ); childMap[name].prevSiblings.erase ( name ); // Don't depend on oneself previous.insert ( name ); countMap[name] += 1; } std::map<wxString, size_t>::iterator countItr = countMap.begin(); for ( ; countItr != countMap.end(); ++countItr ) { if ( childMap[countItr->first].maxOccurs < countItr->second ) childMap[countItr->first].maxOccurs = countItr->second; } if ( childMap.size() == countMap.size() ) continue; for ( itr = childMap.begin(); itr != childMap.end(); ++itr ) { if ( countMap.find ( itr->first ) != countMap.end() ) continue; itr->second.minOccurs = 0; } } // Attribute std::map<wxString, const XMLCh *> &attrMap = data.attrMap; std::set<wxString> &optAttrs = data.optAttrs; std::map<wxString, const XMLCh *>::iterator attrItr; elmtItr = data.nodes.begin(); for ( ; elmtItr != data.nodes.end(); ++elmtItr ) { if ( ! ( **elmtItr ).hasAttributes() ) continue; wxString name; DOMAttr *attr; DOMNamedNodeMap *attrs = ( **elmtItr ).getAttributes(); size_t i = attrs->getLength(); while ( i-- > 0 ) { attr = ( DOMAttr* ) attrs->item ( i ); name = WrapXerces::toString ( attr->getName() ); if ( attr->getPrefix() != NULL ) { wxLogDebug ( _T("Ignore: %s"), name.c_str() ); continue; } if ( attr->getSpecified() ) attrMap[name]; // Initialize attribute map else attrMap[name] = attr->getValue(); } if ( attrMap.size() == optAttrs.size() ) continue; for ( attrItr = attrMap.begin(); attrItr != attrMap.end(); ++attrItr ) { if ( attrs->getNamedItem ( ( const XMLCh * ) WrapXerces::toString ( attrItr->first ).GetData() ) == NULL ) { optAttrs.insert ( attrItr->first ); } } } // Deal with sequence wxLogDebug ( _T("%s:"), elementName.c_str() ); data.useSequence = getSequence ( data.sequence, childMap ); // Now we have the data of the element if ( mGrammarType == Grammar::DTDGrammarType ) { generateDTD ( data, nIndent ); mSchema << data.schema; } else if ( !mInlineSimpleType ) { // Or wait until all data are available generateSchema ( data, nIndent ); mSchema << data.schema; } }