/// <summary> /// This method retrieves an XmlReader within a specified context. /// Moreover it collects label values before or after a geometry could be found. /// </summary> /// <param name="reader">An XmlReader instance that is the origin of a created sub-reader</param> /// <param name="labels">A dictionary for recording label values. Pass 'null' to ignore searching for label values</param> /// <param name="pathNodes">A list of <see cref="IPathNode"/> instances defining the context of the retrieved reader</param> /// <returns>A sub-reader of the XmlReader given as argument</returns> protected XmlReader GetSubReaderOf(XmlReader reader, Dictionary <string, string> labels, List <IPathNode> pathNodes) { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (pathNodes[0].Matches(reader)) { pathNodes.RemoveAt(0); if (pathNodes.Count > 0) { return(GetSubReaderOf(reader.ReadSubtree(), null, pathNodes)); } return(reader.ReadSubtree()); } if (labels != null) { if (LabelNode != null) { if (LabelNode.Matches(reader)) { var labelName = reader.Name; var labelValue = reader.ReadString(); // remove the namespace if (labelName.Contains(":")) { labelName = labelName.Split(':')[1]; } labels.Add(labelName, labelValue); } } } if (!ServiceExceptionNode.Matches(reader)) { continue; } string errorMessage = reader.ReadInnerXml(); Trace.TraceError("A service exception occured: " + errorMessage); throw new Exception("A service exception occured: " + errorMessage); } } return(null); }
/// <summary> /// This method retrieves an XmlReader within a specified context. /// Moreover it collects label values before or after a geometry could be found. /// </summary> /// <param name="reader">An XmlReader instance that is the origin of a created sub-reader</param> /// <param name="labelValue">A string array for recording a found label value. Pass 'null' to ignore searching for label values</param> /// <param name="pathNodes">A list of <see cref="IPathNode"/> instances defining the context of the retrieved reader</param> /// <returns>A sub-reader of the XmlReader given as argument</returns> protected XmlReader GetSubReaderOf(XmlReader reader, string[] labelValue, List <IPathNode> pathNodes) { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (pathNodes[0].Matches(reader)) { pathNodes.RemoveAt(0); if (pathNodes.Count > 0) { return(GetSubReaderOf(reader.ReadSubtree(), null, pathNodes)); } return(reader.ReadSubtree()); } if (labelValue != null) { if (LabelNode != null) { if (LabelNode.Matches(reader)) { labelValue[0] = reader.ReadElementString(); } } } if (!ServiceExceptionNode.Matches(reader)) { continue; } string errorMessage = reader.ReadInnerXml(); Trace.TraceError("A service exception occured: " + errorMessage); throw new Exception("A service exception occured: " + errorMessage); } } return(null); }
/// <summary> /// This method detects the geometry type from 'GetFeature' response and uses a geometry factory to create the /// appropriate geometries. /// </summary> /// <returns></returns> internal override Collection <Geometry> CreateGeometries(Features features) { GeometryFactory geomFactory = null; string geometryTypeString = string.Empty; if (_quickGeometries) { _multiGeometries = false; } IPathNode pointNode = new PathNode(Gmlns, "Point", (NameTable)XmlReader.NameTable); IPathNode lineStringNode = new PathNode(Gmlns, "LineString", (NameTable)XmlReader.NameTable); IPathNode polygonNode = new PathNode(Gmlns, "Polygon", (NameTable)XmlReader.NameTable); IPathNode multiPointNode = new PathNode(Gmlns, "MultiPoint", (NameTable)XmlReader.NameTable); IPathNode multiLineStringNode = new PathNode(Gmlns, "MultiLineString", (NameTable)XmlReader.NameTable); IPathNode multiCurveNode = new PathNode(Gmlns, "MultiCurve", (NameTable)XmlReader.NameTable); IPathNode multiLineStringNodeAlt = new AlternativePathNodesCollection(multiLineStringNode, multiCurveNode); IPathNode multiPolygonNode = new PathNode(Gmlns, "MultiPolygon", (NameTable)XmlReader.NameTable); IPathNode multiSurfaceNode = new PathNode(Gmlns, "MultiSurface", (NameTable)XmlReader.NameTable); IPathNode multiPolygonNodeAlt = new AlternativePathNodesCollection(multiPolygonNode, multiSurfaceNode); while (XmlReader.Read()) { if (XmlReader.NodeType == XmlNodeType.Element) { if (_multiGeometries) { if (multiPointNode.Matches(XmlReader)) { geomFactory = new MultiPointFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "MultiPointPropertyType"; break; } if (multiLineStringNodeAlt.Matches(XmlReader)) { geomFactory = new MultiLineStringFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "MultiLineStringPropertyType"; break; } if (multiPolygonNodeAlt.Matches(XmlReader)) { geomFactory = new MultiPolygonFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "MultiPolygonPropertyType"; break; } } if (pointNode.Matches(XmlReader)) { geomFactory = new PointFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "PointPropertyType"; break; } if (lineStringNode.Matches(XmlReader)) { geomFactory = new LineStringFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "LineStringPropertyType"; break; } if (polygonNode.Matches(XmlReader)) { geomFactory = new PolygonFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "PolygonPropertyType"; break; } if (ServiceExceptionNode.Matches(XmlReader)) { string serviceException = XmlReader.ReadInnerXml(); Trace.TraceError("A service exception occured: " + serviceException); throw new Exception("A service exception occured: " + serviceException); } } } FeatureTypeInfo.Geometry.GeometryType = geometryTypeString; if (geomFactory == null) { return(Geoms); } geomFactory.CreateGeometries(features); return(Geoms); }
/// <summary> /// This method detects the geometry type from 'GetFeature' response and uses a geometry factory to create the /// appropriate geometries. /// </summary> /// <returns></returns> internal override Collection<Geometry> CreateGeometries(Features features) { GeometryFactory geomFactory = null; string geometryTypeString = string.Empty; if (_quickGeometries) _multiGeometries = false; IPathNode pointNode = new PathNode(Gmlns, "Point", (NameTable) XmlReader.NameTable); IPathNode lineStringNode = new PathNode(Gmlns, "LineString", (NameTable) XmlReader.NameTable); IPathNode polygonNode = new PathNode(Gmlns, "Polygon", (NameTable) XmlReader.NameTable); IPathNode multiPointNode = new PathNode(Gmlns, "MultiPoint", (NameTable) XmlReader.NameTable); IPathNode multiLineStringNode = new PathNode(Gmlns, "MultiLineString", (NameTable) XmlReader.NameTable); IPathNode multiCurveNode = new PathNode(Gmlns, "MultiCurve", (NameTable) XmlReader.NameTable); IPathNode multiLineStringNodeAlt = new AlternativePathNodesCollection(multiLineStringNode, multiCurveNode); IPathNode multiPolygonNode = new PathNode(Gmlns, "MultiPolygon", (NameTable) XmlReader.NameTable); IPathNode multiSurfaceNode = new PathNode(Gmlns, "MultiSurface", (NameTable) XmlReader.NameTable); IPathNode multiPolygonNodeAlt = new AlternativePathNodesCollection(multiPolygonNode, multiSurfaceNode); while (XmlReader.Read()) { if (XmlReader.NodeType == XmlNodeType.Element) { if (_multiGeometries) { if (multiPointNode.Matches(XmlReader)) { geomFactory = new MultiPointFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "MultiPointPropertyType"; break; } if (multiLineStringNodeAlt.Matches(XmlReader)) { geomFactory = new MultiLineStringFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "MultiLineStringPropertyType"; break; } if (multiPolygonNodeAlt.Matches(XmlReader)) { geomFactory = new MultiPolygonFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "MultiPolygonPropertyType"; break; } } if (pointNode.Matches(XmlReader)) { geomFactory = new PointFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "PointPropertyType"; break; } if (lineStringNode.Matches(XmlReader)) { geomFactory = new LineStringFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "LineStringPropertyType"; break; } if (polygonNode.Matches(XmlReader)) { geomFactory = new PolygonFactory(_httpClientUtil, FeatureTypeInfo); geometryTypeString = "PolygonPropertyType"; break; } if (ServiceExceptionNode.Matches(XmlReader)) { string serviceException = XmlReader.ReadInnerXml(); Trace.TraceError("A service exception occured: " + serviceException); throw new Exception("A service exception occured: " + serviceException); } } } FeatureTypeInfo.Geometry.GeometryType = geometryTypeString; if (geomFactory == null) return Geoms; geomFactory.CreateGeometries(features); return Geoms; }