Skip to content

Commit f427577

Browse files
committed
[Server][WFS] Define encodeValueToText to correctly format field values
1 parent 00d81e0 commit f427577

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

src/server/qgswfsserver.cpp

+50-2
Original file line numberDiff line numberDiff line change
@@ -2129,7 +2129,7 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
21292129
}*/
21302130

21312131
QDomElement fieldElem = doc.createElement( "qgs:" + attributeName.replace( " ", "_" ).replace( mConfigParser->getCleanTagNameRegExp(), "" ) );
2132-
QDomText fieldText = doc.createTextNode( featureAttributes[idx].toString() );
2132+
QDomText fieldText = doc.createTextNode( encodeValueToText( featureAttributes[idx] ) );
21332133
fieldElem.appendChild( fieldText );
21342134
typeNameElement.appendChild( fieldElem );
21352135
}
@@ -2213,14 +2213,62 @@ QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc
22132213
}*/
22142214

22152215
QDomElement fieldElem = doc.createElement( "qgs:" + attributeName.replace( " ", "_" ).replace( mConfigParser->getCleanTagNameRegExp(), "" ) );
2216-
QDomText fieldText = doc.createTextNode( featureAttributes[idx].toString() );
2216+
QDomText fieldText = doc.createTextNode( encodeValueToText( featureAttributes[idx] ) );
22172217
fieldElem.appendChild( fieldText );
22182218
typeNameElement.appendChild( fieldElem );
22192219
}
22202220

22212221
return featureElement;
22222222
}
22232223

2224+
QString QgsWFSServer::encodeValueToText( const QVariant& value )
2225+
{
2226+
if ( value.isNull() )
2227+
return "null";
2228+
2229+
switch ( value.type() )
2230+
{
2231+
case QVariant::Int:
2232+
case QVariant::UInt:
2233+
case QVariant::LongLong:
2234+
case QVariant::ULongLong:
2235+
case QVariant::Double:
2236+
return value.toString();
2237+
2238+
case QVariant::Bool:
2239+
return value.toBool() ? "true" : "false";
2240+
2241+
case QVariant::StringList:
2242+
case QVariant::List:
2243+
case QVariant::Map:
2244+
{
2245+
QString v = QgsJSONUtils::encodeValue( value );
2246+
2247+
//do we need CDATA
2248+
if ( v.indexOf( '<' ) != -1 || v.indexOf( '&' ) != -1 )
2249+
{
2250+
v.prepend( "<![CDATA[" ).append( "]]>" );
2251+
}
2252+
2253+
return v;
2254+
}
2255+
2256+
default:
2257+
case QVariant::String:
2258+
{
2259+
QString v = value.toString();
2260+
2261+
//do we need CDATA
2262+
if ( v.indexOf( '<' ) != -1 || v.indexOf( '&' ) != -1 )
2263+
{
2264+
v.prepend( "<![CDATA[" ).append( "]]>" );
2265+
}
2266+
2267+
return v;
2268+
}
2269+
}
2270+
}
2271+
22242272
QString QgsWFSServer::serviceUrl() const
22252273
{
22262274
QUrl mapUrl( getenv( "REQUEST_URI" ) );

src/server/qgswfsserver.h

+3
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ class QgsWFSServer: public QgsOWSServer
136136
QDomElement createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
137137
const QgsAttributeList& pkAttributes = QgsAttributeList() ) /*const*/;
138138

139+
//methods to encode value to string for text node
140+
QString encodeValueToText( const QVariant& value );
141+
139142
void addTransactionResult( QDomDocument& responseDoc, QDomElement& responseElem, const QString& status, const QString& locator, const QString& message );
140143
};
141144

0 commit comments

Comments
 (0)