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 { char *fName = fieldName(childElem); int fIndex = feature->GetGeomFieldIndex(fName); OGRGeometry *geom = getGeometry(childElem, type); if (fIndex == -1) { // Unknown model feature->SetGeometryDirectly(geom); } else { OGRwkbGeometryType geomType = feature->GetGeomFieldDefnRef(fIndex)->GetType(); if (geomType == wkbMultiLineString || geomType == wkbPolygon) { feature->SetGeomFieldDirectly(fIndex, geom->getLinearGeometry()); delete geom; } else { feature->SetGeomFieldDirectly(fIndex, geom); } } CPLFree(fName); } } }