<PackageReference Include="Castle.Core" Version="3.3.2" />

XmlPositionComparer

public class XmlPositionComparer
namespace Castle.Components.DictionaryAdapter.Xml { public class XmlPositionComparer { private struct ComparandIterator { public IXmlNode Node; public XmlName Name; public CompiledXPathNode Step; public bool MoveNext() { if (Step == null) { if (Node == null) return Stop(); return ConsumeNode(); } return ConsumeStep(); } private bool ConsumeNode() { bool result = true; CompiledXPath path = Node.Path; if (path != null) result = ConsumeFirstStep(path); else Name = Node.Name; Node = Node.Parent; return result; } private bool Stop() { Name = XmlName.Empty; return false; } private bool ConsumeFirstStep(CompiledXPath path) { if (!path.IsCreatable) return false; Step = path.LastStep; return ConsumeStep(); } private bool ConsumeStep() { Name = new XmlName(Step.LocalName, Node.LookupNamespaceUri(Step.Prefix)); Step = Step.PreviousNode; return true; } } public static readonly XmlPositionComparer Instance = new XmlPositionComparer(); public bool Equals(IXmlNode nodeA, IXmlNode nodeB) { XmlNameComparer default = XmlNameComparer.Default; ComparandIterator comparandIterator = default(ComparandIterator); comparandIterator.Node = nodeA; ComparandIterator comparandIterator2 = comparandIterator; ComparandIterator comparandIterator3 = default(ComparandIterator); comparandIterator3.Node = nodeB; ComparandIterator comparandIterator4 = comparandIterator3; do { if (comparandIterator2.Node.IsReal && comparandIterator4.Node.IsReal) return comparandIterator2.Node.UnderlyingPositionEquals(comparandIterator4.Node); if (!comparandIterator2.MoveNext() || !comparandIterator4.MoveNext()) return false; } while (default.Equals(comparandIterator2.Name, comparandIterator4.Name)); return false; } } }