static string IteratePathSegments(XmlPath xmlPath, ref XElement currentElement) { var scalarSegment = string.Empty; var pathSegments = new List <XmlPathSegment>(xmlPath.GetSegements().OfType <XmlPathSegment>()); var segmentIndex = 0; while (currentElement != null && segmentIndex < pathSegments.Count) { if (segmentIndex == 0 && currentElement.Name != pathSegments[segmentIndex].ActualSegment && currentElement.Name.LocalName != pathSegments[segmentIndex].ActualSegment) { currentElement = null; scalarSegment = null; } else if (segmentIndex == 0 && pathSegments.Count == 1 && currentElement.Name.LocalName == pathSegments[segmentIndex].ActualSegment) { scalarSegment = currentElement.Value; } else { scalarSegment = ScalarSegment(ref currentElement, pathSegments, segmentIndex); } segmentIndex++; } return(scalarSegment); }
public void GetSegments_Expected_LastSegmentIsCorrect() { XmlPath path = new XmlPath("Company.Departments().Department:Name", "Company.Departments.Department:Name"); const string expected = "Name"; string actual = path.GetSegements().Last().ToString(); Assert.AreEqual(expected, actual); }
public void GetSegments_Expected_CorrectSegmentCount() { XmlPath path = new XmlPath("Company.Departments().Department:Name", "Company.Departments.Department:Name"); const int expected = 4; int actual = path.GetSegements().Count(); Assert.AreEqual(expected, actual); }
public IEnumerable <object> SelectEnumerable(IPath path) { if (path == null) { throw new ArgumentNullException("path"); } XmlPath xmlPath = path as XmlPath; if (xmlPath == null) { throw new Exception(string.Format("Path of type '{0}' expected, path of type '{1}' received.", typeof(XmlPath), path.GetType())); } XDocument document = Data as XDocument; if (document == null) { throw new Exception(string.Format("Type of {0} was expected for data, type of {1} was found instead.", typeof(XDocument), Data.GetType())); } List <object> returnData = null; XElement currentElement = document.Root; if (path.ActualPath == XmlPath.NodeSeperatorSymbol) { if (currentElement != null) { returnData = new List <object> { currentElement.ToString() }; } } else { List <IPathSegment> pathSegments = new List <IPathSegment>(xmlPath.GetSegements()); returnData = new List <object>(SelectEnumberable(pathSegments.Skip(1).ToList(), pathSegments.FirstOrDefault(), currentElement)); } return(returnData); }
public object SelectScalar(IPath path) { if (path == null) { throw new ArgumentNullException("path"); } XmlPath xmlPath = path as XmlPath; if (xmlPath == null) { throw new Exception(string.Format("Path of type '{0}' expected, path of type '{1}' received.", typeof(XmlPath), path.GetType())); } XDocument document = Data as XDocument; if (document == null) { throw new Exception(string.Format("Type of {0} was expected for data, type of {1} was found instead.", typeof(XDocument), Data.GetType())); } string returnData = string.Empty; XElement currentElement = document.Root; if (path.ActualPath == XmlPath.NodeSeperatorSymbol) { if (currentElement != null) { returnData = currentElement.ToString(); } } else { List <XmlPathSegment> pathSegments = new List <XmlPathSegment>(xmlPath.GetSegements().OfType <XmlPathSegment>()); int segmentIndex = 0; while (currentElement != null && segmentIndex < pathSegments.Count) { if (segmentIndex == 0 && currentElement.Name != pathSegments[segmentIndex].ActualSegment) { currentElement = null; returnData = null; } else if (segmentIndex == 0 && pathSegments.Count == 1 && currentElement.Name == pathSegments[segmentIndex].ActualSegment) { returnData = currentElement.Value; } else if (segmentIndex > 0) { if (pathSegments[segmentIndex].IsAttribute) { XAttribute attribute = currentElement.Attribute(pathSegments[segmentIndex].ActualSegment); if (attribute != null) { currentElement = null; returnData = attribute.Value; } } else { currentElement = currentElement.Elements(pathSegments[segmentIndex].ActualSegment).LastOrDefault(); // Travis.Frisinger : 09/10/2012 - Fix for null element, naughty Brendan ;) if (currentElement != null) { returnData = currentElement.Value; } else { returnData = string.Empty; } } } segmentIndex++; } } return(returnData); }