private IEnumerable<XPathPart> GetPathParts(XObject node)
{
XElement selectedElement;
if(IsElement(node))
{
selectedElement = (XElement)node;
}
else if(IsAttribute(node))
{
selectedElement = node.Parent;
}
else
{
throw new ArgumentException("Node is not an element or attribute: " + node.GetType(), nameof(node));
}
var parts = new List<XPathPart>();
var ancestorsAndSelf = selectedElement.AncestorsAndSelf().Reverse();
foreach(var ancestor in ancestorsAndSelf)
{
var part = new XPathPart();
part.Node = ancestor;
part.Predicates = ancestor.Attributes().Where(MatchesAnyFilter).ToArray();
parts.Add(part);
}
if(IsAttribute(node))
{
parts.Add(new XPathPart {Node = node});
}
return parts;
}