Exemplo n.º 1
0
        /// <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("]");
            }
        }