XmlElementList XmlElement::getChildren() const { XmlElementList vec; DOMElement* curr = base->getFirstElementChild(); while(curr) { if(!(curr->getNodeType() == DOMNode::TEXT_NODE || curr->getNodeType() == DOMNode::COMMENT_NODE)) //skip text nodes and comments vec.push_back( XmlElement(curr, doc) ); curr = curr->getNextElementSibling(); } return vec; }
void ILI2Reader::SetFieldValues(OGRFeature *feature, DOMElement* elem) { int type = 0; //recursively search children for (DOMElement *childElem = (DOMElement *)elem->getFirstChild(); type == 0 && childElem && childElem->getNodeType() == DOMNode::ELEMENT_NODE; childElem = (DOMElement*)childElem->getNextSibling()) { type = getGeometryTypeOfElem(childElem); if (type == 0) { if (childElem->getFirstChild() && childElem->getFirstChild()->getNodeType() == DOMNode::ELEMENT_NODE) { SetFieldValues(feature, childElem); } else { char *fName = fieldName(childElem); int fIndex = feature->GetFieldIndex(fName); if (fIndex != -1) { char * objVal = getObjValue(childElem); if (objVal == NULL) objVal = getREFValue(childElem); // only to try feature->SetField(fIndex, objVal); CPLFree(objVal); } else { CPLDebug( "OGR_ILI","Attribute '%s' not found", fName); m_missAttrs.push_back(fName); } CPLFree(fName); } } else { feature->SetGeometryDirectly(getGeometry(childElem, type)); } } }
char *getObjValue(DOMElement *elem) { DOMElement *textElem = (DOMElement *)elem->getFirstChild(); if ((textElem != NULL) && (textElem->getNodeType() == DOMNode::TEXT_NODE)) { char* pszNodeValue = XMLString::transcode(textElem->getNodeValue()); char* pszRet = CPLStrdup(pszNodeValue); XMLString::release(&pszNodeValue); return pszRet; } return NULL; }
void ILI2Reader::setFieldDefn(OGRFeatureDefn *featureDef, DOMElement* elem) { int type = 0; //recursively search children for (DOMElement *childElem = (DOMElement *)elem->getFirstChild(); type == 0 && childElem && childElem->getNodeType() == DOMNode::ELEMENT_NODE; childElem = (DOMElement*)childElem->getNextSibling()) { type = getGeometryTypeOfElem(childElem); if (type == 0) { if (childElem->getFirstChild() && childElem->getFirstChild()->getNodeType() == DOMNode::ELEMENT_NODE) { setFieldDefn(featureDef, childElem); } else { char *fName = fieldName(childElem); if (featureDef->GetFieldIndex(fName) == -1) { CPLDebug( "OGR_ILI", "AddFieldDefn: %s",fName ); OGRFieldDefn oFieldDefn(fName, OFTString); featureDef->AddFieldDefn(&oFieldDefn); } CPLFree(fName); } } } }
DOMDocument * XIncludeUtils::doXIncludeXMLFileDOM(const XMLCh *href, const XMLCh *relativeHref, DOMNode *includeNode, DOMDocument *parsedDocument, XMLEntityHandler* entityResolver){ if (XIncludeUtils::isInCurrentInclusionHistoryStack(href)){ /* including something back up the current history */ XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCircularInclusionLoop, href, href); return NULL; } if (XMLString::equals(href, parsedDocument->getBaseURI())){ /* trying to include itself */ XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeCircularInclusionDocIncludesSelf, href, href); return NULL; } /* Instantiate the DOM parser. */ XercesDOMParser parser; parser.setDoNamespaces(true); /* don't want to recurse the xi processing here */ parser.setDoXInclude(false); /* create the schema info nodes, so that we can detect conflicting notations */ parser.setCreateSchemaInfo(true); XMLInternalErrorHandler xierrhandler; parser.setErrorHandler(&xierrhandler); DOMDocument *includedNode = NULL; try { InputSource* is=NULL; Janitor<InputSource> janIS(is); if(entityResolver) { XMLResourceIdentifier resIdentifier(XMLResourceIdentifier::ExternalEntity, relativeHref, NULL, NULL, includeNode->getBaseURI()); is=entityResolver->resolveEntity(&resIdentifier); janIS.reset(is); } if(janIS.get()!=NULL) parser.parse(*janIS.get()); else parser.parse(href); /* need to be able to release the parser but keep the document */ if (!xierrhandler.getSawError() && !xierrhandler.getSawFatal()) includedNode = parser.adoptDocument(); } catch (const XMLException& /*toCatch*/) { XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeResourceErrorWarning, href, href); } catch (const DOMException& /*toCatch*/) { XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeResourceErrorWarning, href, href); } catch (...) { XIncludeUtils::reportError(parsedDocument, XMLErrs::XIncludeResourceErrorWarning, href, href); } //addDocumentURIToCurrentInclusionHistoryStack(href); if(includedNode != NULL){ /* baseURI fixups - see http://www.w3.org/TR/xinclude/#base for details. */ DOMElement *topLevelElement = includedNode->getDocumentElement(); if (topLevelElement && topLevelElement->getNodeType() == DOMNode::ELEMENT_NODE ){ XMLUri parentURI(includeNode->getBaseURI()); XMLUri includedURI(includedNode->getBaseURI()); /* if the paths differ we need to add a base attribute */ if (!XMLString::equals(parentURI.getPath(), includedURI.getPath())){ if (getBaseAttrValue(topLevelElement) == NULL){ /* need to calculate the proper path difference to get the relativePath */ topLevelElement->setAttribute(fgXIBaseAttrName, relativeHref); } else { /* the included node has base of its own which takes precedence */ XIncludeLocation xil(getBaseAttrValue(topLevelElement)); if (getBaseAttrValue(includeNode) != NULL){ /* prepend any specific base modification of the xinclude node */ xil.prependPath(getBaseAttrValue(includeNode)); } topLevelElement->setAttribute(fgXIBaseAttrName, xil.getLocation()); } } } } return includedNode; }