From 24737be1b8277d979e22dd665f447087671c560e Mon Sep 17 00:00:00 2001 From: rldhont Date: Tue, 3 Apr 2018 17:15:54 +0200 Subject: [PATCH] [BUGFIX][Server] Enhance cleaning propertyname and searching by propertyname --- .../services/wfs/qgswfsdescribefeaturetype.cpp | 2 +- src/server/services/wfs/qgswfsgetfeature.cpp | 12 +++++++++--- src/server/services/wfs/qgswfsutils.h | 3 +++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/server/services/wfs/qgswfsdescribefeaturetype.cpp b/src/server/services/wfs/qgswfsdescribefeaturetype.cpp index 7a621e46219..cf9cea4ede3 100644 --- a/src/server/services/wfs/qgswfsdescribefeaturetype.cpp +++ b/src/server/services/wfs/qgswfsdescribefeaturetype.cpp @@ -263,7 +263,7 @@ namespace QgsWfs //xsd:element QDomElement attElem = doc.createElement( QStringLiteral( "element" )/*xsd:element*/ ); - attElem.setAttribute( QStringLiteral( "name" ), attributeName.replace( ' ', '_' ) ); + attElem.setAttribute( QStringLiteral( "name" ), attributeName.replace( ' ', '_' ).replace( cleanTagNameRegExp, QLatin1String( "" ) ) ); QVariant::Type attributeType = fields.at( idx ).type(); if ( attributeType == QVariant::Int ) attElem.setAttribute( QStringLiteral( "type" ), QStringLiteral( "integer" ) ); diff --git a/src/server/services/wfs/qgswfsgetfeature.cpp b/src/server/services/wfs/qgswfsgetfeature.cpp index 9360c6db873..c270d14460a 100644 --- a/src/server/services/wfs/qgswfsgetfeature.cpp +++ b/src/server/services/wfs/qgswfsgetfeature.cpp @@ -250,15 +250,21 @@ namespace QgsWfs QList idxList; // build corresponding propertyname QList propertynames; + QList fieldnames; for ( int idx = 0; idx < fields.count(); ++idx ) { - propertynames.append( fields.field( idx ).name().replace( ' ', '_' ) ); + fieldnames.append( fields[idx].name() ); + propertynames.append( fields.field( idx ).name().replace( ' ', '_' ).replace( cleanTagNameRegExp, QLatin1String( "" ) ) ); } QString fieldName; for ( plstIt = propertyList.begin(); plstIt != propertyList.end(); ++plstIt ) { fieldName = *plstIt; int fieldNameIdx = propertynames.indexOf( fieldName ); + if ( fieldNameIdx == -1 ) + { + fieldNameIdx = fieldnames.indexOf( fieldName ); + } if ( fieldNameIdx > -1 ) { idxList.append( fieldNameIdx ); @@ -1319,7 +1325,7 @@ namespace QgsWfs } QString attributeName = fields.at( idx ).name(); - QDomElement fieldElem = doc.createElement( "qgs:" + attributeName.replace( ' ', '_' ) ); + QDomElement fieldElem = doc.createElement( "qgs:" + attributeName.replace( ' ', '_' ).replace( cleanTagNameRegExp, QLatin1String( "" ) ) ); QDomText fieldText = doc.createTextNode( featureAttributes[idx].toString() ); fieldElem.appendChild( fieldText ); typeNameElement.appendChild( fieldElem ); @@ -1416,7 +1422,7 @@ namespace QgsWfs } QString attributeName = fields.at( idx ).name(); - QDomElement fieldElem = doc.createElement( "qgs:" + attributeName.replace( ' ', '_' ) ); + QDomElement fieldElem = doc.createElement( "qgs:" + attributeName.replace( ' ', '_' ).replace( cleanTagNameRegExp, QLatin1String( "" ) ) ); QDomText fieldText = doc.createTextNode( featureAttributes[idx].toString() ); fieldElem.appendChild( fieldText ); typeNameElement.appendChild( fieldElem ); diff --git a/src/server/services/wfs/qgswfsutils.h b/src/server/services/wfs/qgswfsutils.h index 99589815dc4..d657e67fca6 100644 --- a/src/server/services/wfs/qgswfsutils.h +++ b/src/server/services/wfs/qgswfsutils.h @@ -58,6 +58,9 @@ namespace QgsWfs const QString OGC_NAMESPACE = QStringLiteral( "http://www.opengis.net/ogc" ); const QString QGS_NAMESPACE = QStringLiteral( "http://www.qgis.org/gml" ); + // Define clean tagName regExp + const QRegExp cleanTagNameRegExp( "(?![\\w\\d\\.-])." ); + } // namespace QgsWfs #endif