/// <summary> /// Build the xml XPath from the element recursively. /// </summary> /// <param name="element">The element.</param> /// <param name="xpath">The result XPath.</param> /// <param name="namespaces">The namespaces used in the XPath.</param> internal static void BuildXPath(OpenXmlElement element, StringBuilder xpath, Dictionary <string, string> namespaces) { if (element.Parent != null) { BuildXPath(element.Parent, xpath, namespaces); } xpath.Append("/"); if (element is OpenXmlMiscNode) { xpath.Append(element.OuterXml); } else { Debug.Assert(!string.IsNullOrEmpty(element.LocalName)); if (!string.IsNullOrEmpty(element.Prefix)) { if (!namespaces.ContainsKey(element.Prefix)) { namespaces.Add(element.Prefix, element.NamespaceUri); } xpath.Append(element.Prefix); xpath.Append(":"); } else if (!string.IsNullOrEmpty(element.NamespaceUri)) { xpath.Append(element.NamespaceUri); xpath.Append(":"); } xpath.Append(element.LocalName); xpath.Append("["); xpath.Append(element.GetXPathIndex()); xpath.Append("]"); } }