private static XElement CreateXmlElement(UrlAddress urlAddress) { XElement xmlElement = new XElement("urlAdress"); XElement hostElement = new XElement("host", new XAttribute("name", urlAddress.HostName)); xmlElement.Add(hostElement); XElement uri = new XElement("uri"); foreach (var item in urlAddress.Segments) { uri.Add(new XElement("segment", item)); } xmlElement.Add(uri); XElement parameters = new XElement("parameters"); foreach (var item in urlAddress.Parameters) { parameters.Add(new XElement( "parameter", new XAttribute("value", item.Value), new XAttribute("key", item.Key))); } if (parameters.HasElements) { xmlElement.Add(parameters); } return(xmlElement); }
/// <summary> /// Parses string to UrlAddress class. /// </summary> /// <param name="sourceString">String to parse.</param> /// <returns></returns> public UrlAddress Parse(string sourceString) { _ = sourceString ?? throw new ArgumentNullException(); _ = validator ?? throw new ArgumentNullException(); if (!validator.IsValid(sourceString)) { throw new ArgumentException("Source string is not a valid URL", nameof(sourceString)); } UrlAddress url = new UrlAddress(); url.Protocol = sourceString.Substring(0, sourceString.IndexOf(schemeHostSeparator)); sourceString = sourceString.Substring(sourceString.IndexOf(schemeHostSeparator) + 3); url.HostName = sourceString.Substring(0, sourceString.IndexOf(segmentSeparator)); sourceString = sourceString.Substring(sourceString.IndexOf(segmentSeparator) + 1); if (sourceString.Contains(beginOfParamaters)) { var segments = sourceString.Substring(0, sourceString.IndexOf(beginOfParamaters)); foreach (string segment in segments.Split(new char[] { segmentSeparator }, StringSplitOptions.RemoveEmptyEntries)) { url.Segments.Add(segment); } sourceString = sourceString.Substring(sourceString.IndexOf(beginOfParamaters) + 1); var parameters = sourceString.Split(parametersSeparator); foreach (var parameter in parameters) { var keyvaluePair = parameter.Split(keyValueSeparator); url.Parameters.Add(keyvaluePair[0], keyvaluePair[1]); } } else { foreach (var segment in sourceString.Split(new char[] { segmentSeparator }, StringSplitOptions.RemoveEmptyEntries)) { url.Segments.Add(segment); } } return(url); }