public static XElement GetElement(XElement referenceElement, string xPath) { var parts = xPath.Split('/'); var currentElement = referenceElement; foreach (var part in parts) { if (part == "..") { currentElement = currentElement.Parent; } else { var splitPath = part.Split('['); var childElementName = splitPath[0]; var index = 0; if (splitPath.Length > 1) { var indexAsString = splitPath[1].Split(']')[0]; // numbering starts with 1 index = int.Parse(indexAsString) - 1; } currentElement = currentElement.Elements(childElementName).ElementAtOrDefault(index); } if (currentElement == null) break; } return currentElement; }
public static bool HasReferenceTo(this XElement element, XElement target) { var referenceAttribute = element.Attribute(ReferenceAttributeName); return(referenceAttribute != null && XPathHelper.GetElement(element, referenceAttribute.Value) == target); }