// @require WFS_URL var DBG = DBG || false // wfsFeature json format: /* { $fieldName: - string => field value - array of objects => ref features as objects (wfsFeature) - array of strings => ref features as xlink url } */ function p5WFS_ParseFeatureFieldRecurse(tagNode) { // @returns object from xml element var item = {} var i = 0 for (i = 0; i < tagNode.children.length; i++) { var fieldNode = tagNode.children[i] console.log('DBG: parse rec ifd(' + tagNode.getAttribute('fid') + ') tagName: ', fieldNode.tagName); if ('p5:links' === fieldNode.tagName) { // // ​ // ​"https://.../wfs-data.php/default_db/?SERVICE=WFS&VERSION=1.0.0&TYPENAME=default_db__x3A__BI_audit_KW_requested_person:BI_audit_KW_requested_person&REQUEST=GetFeature&backRefNS=default_db/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA/BI_audit_ENERGA_RUM_KONTRAHENCI_POWIAZANIA&backRefPK=20&backRefField=default_db__x3A__BI_audit_KW_requested_person:BI_audit_KW_requested_person&startIndex=10" // ​ for (var j = 0; j < fieldNode.children.length; j++) { var p5LinkNode = fieldNode.children[j] if ('p5:next' === p5LinkNode.tagName) { var typeName = p5LinkNode.getAttribute('p5:typeName') item[ typeName ].push( { 'type': 'next', '@backRefNS': p5LinkNode.getAttribute('p5:backRefNS'), '@backRefPK': p5LinkNode.getAttribute('p5:backRefPK'), '@typeName': p5LinkNode.getAttribute('p5:typeName'), '@startIndex': p5LinkNode.getAttribute('p5:startIndex'), 'value': p5LinkNode.textContent } ) } else { if (DBG) console.warn("Not implemented p5:links/" + p5LinkNode.tagName) } } } else if (!fieldNode.children.length) { if (fieldNode.textContent) item[ fieldNode.localName ] = fieldNode.textContent else { var xlink = fieldNode.getAttribute('xlink:href') if (xlink) { if (!(fieldNode.tagName in item)) item[ fieldNode.tagName ] = [] item[ fieldNode.tagName ].push( xlink ) } } } else { if (!(fieldNode.tagName in item)) item[ fieldNode.tagName ] = [] item[ fieldNode.tagName ].push( p5WFS_ParseFeatureFieldRecurse(fieldNode) ) } } return item } function p5WFS_ParseFeatureMember(featureMember) { // @returns object from xml element if (!featureMember) return null if (!featureMember.children.length) return null var featureNode = featureMember.children[0] if (!featureNode) return null if (!featureNode.children.length) return null return p5WFS_ParseFeatureFieldRecurse(featureNode) } /** * @usage p5WFS_GetFeature('p5_default_db:CRM_PROCES', { 'featureID': 'CRM_PROCES.' + id, }).then(function (features) { // ... }).catch(function (e) { // ... }) * @usage - expected one feature p5WFS_GetFeature('p5_default_db:CRM_PROCES', { 'featureID': 'CRM_PROCES.' + id, }).then(function (features) { if (!features) throw "Nie odnaleziono rekordu id = " + id if (!features.length) throw "Nie odnaleziono rekordu id = " + id if (1 !== features.length) throw "Bład: API zwróciło za dużo rekordów" return features[0] console.log('fetched features', features) }).then(function (feature) { // ... }).catch(function (e) { // ... }) * @usage - POST p5WFS_GetFeature('p5_default_db:CRM_PROCES', { // 'Filter': '' + "PARENT_ID" + '' + parent_id + '', 'sortBy': 'SORT_PRIO+A,ID', 'ogc:Filter': '' + '' + '' + "PARENT_ID" + '' + parent_id + '' + '' + '' }).then(function (features) { ... */ function p5WFS_GetFeature() { var xmlResponse = (new DOMParser()).parseFromString(responseText, "text/xml"); if (!xmlResponse.children.length) throw "Missing response xml root element"; var xmlRoot = xmlResponse.children[0]; if ('html' === xmlRoot.localName) { console.log(xmlRoot) // html / body / parseerror / div throw "Parse xml error" } if ('FeatureCollection' !== xmlRoot.localName) { if ('ServiceExceptionReport' === xmlRoot.tagName) { if (xmlRoot.children[0] && xmlRoot.children[0].textContent) throw xmlRoot.children[0].textContent throw "WFS API Exception" } throw "Missing FeatureCollection as root element in wfs response" } var features = [] for (var i = 0; i < xmlRoot.children.length; i++) { features.push(p5WFS_ParseFeatureMember(xmlRoot.children[i])) } return features.filter(function (item) { return !!item; }) }