/// <summary> /// Parses a HydroPortal page for a WaterOneFlow service registered using the FGDC metadata standard. /// </summary> /// <param name="pageUrl">The URL to the HydroPortal page describing the service</param> /// <returns>If the page describes a WaterOneFlow service, a DataServiceInfo object describing the service is returned</returns> private DataServiceInfo ParseFgdcPage(string pageUrl) { DataServiceInfo serviceInfo = new DataServiceInfo(); try { using (XmlTextReader reader = new XmlTextReader(pageUrl)) { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { // Abstract if (reader.Name.ToLower() == "abstract") { reader.Read(); serviceInfo.Abstract = reader.Value; } // Citation else if (reader.Name.ToLower() == "citation") { string origin = "(unknown author)"; string title = "(unknown title)"; string pubplace = "(unknown organization)"; string pubdate = "unknown date"; string link = "(unknown link)"; while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name.ToLower() == "origin") { reader.Read(); if (reader.Value.Trim() != String.Empty) { origin = reader.Value; } } else if (reader.Name.ToLower() == "title") { reader.Read(); if (reader.Value.Trim() != String.Empty) { title = reader.Value; } } else if (reader.Name.ToLower() == "pubplace") { reader.Read(); if (reader.Value.Trim() != String.Empty) { pubplace = reader.Value; } } else if (reader.Name.ToLower() == "pubdate") { reader.Read(); if (reader.Value.Trim() != String.Empty) { pubdate = reader.Value; } } else if (reader.Name.ToLower() == "onlink") { reader.Read(); if (reader.Value.Trim() != String.Empty) { link = reader.Value; } } } else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "citation") { break; } } serviceInfo.Citation = origin + ". " + title + ". " + pubdate + ". " + pubplace + ". <" + link + ">."; } // Contact Name and Email else if (reader.Name.ToLower() == "ptcontac") { string contactName = ""; string contactEmail = ""; while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name.ToLower() == "cntper") { reader.Read(); contactName = reader.Value; } else if (reader.Name.ToLower() == "cntemail") { reader.Read(); contactEmail = reader.Value; } } else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "ptcontac") { break; } } serviceInfo.ContactEmail = contactEmail; serviceInfo.ContactName = contactName; } // Bounding Box else if (reader.Name == "bounding") { double west = 0; double east = 0; double north = 0; double south = 0; while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name.ToLower() == "westbc") { reader.Read(); double.TryParse(reader.Value, out west); } else if (reader.Name.ToLower() == "eastbc") { reader.Read(); double.TryParse(reader.Value, out east); } else if (reader.Name.ToLower() == "northbc") { reader.Read(); double.TryParse(reader.Value, out north); } else if (reader.Name.ToLower() == "southbc") { reader.Read(); double.TryParse(reader.Value, out south); } } else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "bounding") { break; } } serviceInfo.EastLongitude = east; serviceInfo.WestLongitude = west; serviceInfo.NorthLatitude = north; serviceInfo.SouthLatitude = south; } // Service Code else if (reader.Name == "ServiceCode") { reader.Read(); serviceInfo.ServiceCode = reader.Value; } // Service Endpoint URL else if (reader.Name == "WaterOneFlowURL") { reader.Read(); serviceInfo.EndpointURL = WebOperations.GetCanonicalUri(reader.Value, true); } // Service Description URL else if (reader.Name == "MapServiceURL") { reader.Read(); serviceInfo.DescriptionURL = reader.Value; } // Service Title else if (reader.Name == "ServiceName") { reader.Read(); serviceInfo.ServiceTitle = reader.Value; } } } } } catch (Exception ex) { throw new WebException("Could not read XML response from " + pageUrl + ".\n" + ex.Message); } return(serviceInfo); }
/// <summary> /// Parses a HydroPortal page for a WaterOneFlow service registered using the Dublin Core metadata standard. /// </summary> /// <param name="pageUrl">The URL to the HydroPortal page describing the service</param> /// <returns>If the page describes a WaterOneFlow service, a DataServiceInfo object describing the service is returned</returns> private DataServiceInfo ParseDublinCorePage(string pageUrl) { DataServiceInfo serviceInfo = new DataServiceInfo(); try { using (XmlTextReader reader = new XmlTextReader(pageUrl)) { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { // Abstract if (reader.Name.ToLower() == "dc:description") { reader.Read(); serviceInfo.Abstract = reader.Value; } // Bounding Box else if (reader.Name == "ows:WGS84BoundingBox") { double west = 0; double east = 0; double north = 0; double south = 0; while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "ows:LowerCorner") { reader.Read(); string[] lowerCorner = reader.Value.Split(' '); if (lowerCorner.Length == 2) { double.TryParse(lowerCorner[0], out west); double.TryParse(lowerCorner[1], out south); } } else if (reader.Name == "ows:UpperCorner") { reader.Read(); string[] upperCorner = reader.Value.Split(' '); if (upperCorner.Length == 2) { double.TryParse(upperCorner[0], out east); double.TryParse(upperCorner[1], out north); } } } else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "ows:WGS84BoundingBox") { break; } } serviceInfo.EastLongitude = east; serviceInfo.WestLongitude = west; serviceInfo.NorthLatitude = north; serviceInfo.SouthLatitude = south; } // Service Code else if (reader.Name.ToLower() == "dc:title") { reader.Read(); serviceInfo.ServiceCode = reader.Value; } // Service Endpoint URL else if (reader.Name.ToLower() == "dc:creator") { reader.Read(); serviceInfo.EndpointURL = WebOperations.GetCanonicalUri(reader.Value, true); } // Service Description URL else if (reader.Name == "dct:references") { reader.Read(); serviceInfo.DescriptionURL = reader.Value; } // Service Title else if (reader.Name.ToLower() == "dct:alternative") { reader.Read(); serviceInfo.ServiceTitle = reader.Value; } } } } } catch (Exception ex) { throw new WebException("Could not read XML response from " + pageUrl + ".\n" + ex.Message); } return(serviceInfo); }