public XmlTreeNode GetTreeNode()

in src/XmlNotepad/Commands.cs [2001:2125]


        public XmlTreeNode GetTreeNode(XmlDocument owner, XmlTreeNode target, XmlTreeView view)
        {
            view.BeginUpdate();
            XmlTreeNode node = null;
            try
            {
                node = view.CreateTreeNode();

                if (this._img == -1 && this._xml != null)
                {
                    Regex regex = new Regex(@"[:_.\w]+\s*=\s*(""[^""]*"")|('[^']*')\s*");
                    Match m = regex.Match(_xml);
                    string trimmed = _xml.Trim();
                    if (m.Success && m.Index == 0 && m.Length == _xml.Length)
                    {
                        _nodeType = (int)XmlNodeType.Attribute;
                        _img = (int)NodeImage.Attribute - 1;
                    }
                    else if (trimmed.StartsWith("<?"))
                    {
                        _nodeType = (int)XmlNodeType.ProcessingInstruction;
                        _img = (int)NodeImage.PI - 1;
                    }
                    else if (trimmed.StartsWith("<!--"))
                    {
                        _nodeType = (int)XmlNodeType.Comment;
                        _img = (int)NodeImage.Comment - 1;
                    }
                    else if (trimmed.StartsWith("<![CDATA["))
                    {
                        _nodeType = (int)XmlNodeType.CDATA;
                        _img = (int)NodeImage.CData - 1;
                    }
                    else if (trimmed.StartsWith("<"))
                    {
                        _nodeType = (int)XmlNodeType.Element;
                        _img = (int)NodeImage.Element - 1;
                    }
                    else
                    {
                        _nodeType = (int)XmlNodeType.Text;
                        _img = (int)NodeImage.Text - 1;
                    }
                }

                XmlNode xn = null;
                XmlNode context = (target != null) ? target.Node : owner;

                if (this._nodeType == (int)XmlNodeType.Attribute)
                {
                    int i = this._xml.IndexOf('=');
                    if (i > 0)
                    {
                        string name = this._xml.Substring(0, i).Trim();
                        XmlName qname = XmlHelpers.ParseName(context, name, XmlNodeType.Attribute);
                        xn = owner.CreateAttribute(qname.Prefix, qname.LocalName, qname.NamespaceUri);
                        string s = this._xml.Substring(i + 1).Trim();
                        if (s.Length > 2)
                        {
                            char quote = s[0];
                            s = s.Substring(1, s.Length - 2); // strip off quotes
                                                              // un-escape quotes in the value.
                            xn.Value = s.Replace(quote == '\'' ? "&apos;" : "&quot;", quote.ToString());
                        }
                    }

                }
                else
                {
                    XmlNamespaceManager nsmgr = XmlHelpers.GetNamespaceScope(context);
                    XmlParserContext pcontext = new XmlParserContext(owner.NameTable, nsmgr, null, XmlSpace.None);
                    XmlTextReader r = null;
                    if (this._xml != null)
                    {
                        r = new XmlTextReader(this._xml, XmlNodeType.Element, pcontext);
                    }
                    else
                    {
                        r = new XmlTextReader(this._stm, XmlNodeType.Element, pcontext);
                    }
                    using (r)
                    {
                        r.WhitespaceHandling = WhitespaceHandling.Significant;

                        // TODO: add multi-select support, so we can insert multiple nodes also.
                        // And find valid nodes (for example, don't attempt to insert Xml declaration
                        // if target node is not at the top of the document, etc).
                        // For now we just favor XML elements over other node types.
                        ArrayList list = new ArrayList();
                        while (true)
                        {
                            XmlNode rn = owner.ReadNode(r);
                            if (rn == null)
                                break;
                            if (rn is XmlElement)
                            {
                                xn = rn;
                                NormalizeNamespaces((XmlElement)rn, nsmgr);
                            }
                            list.Add(rn);
                        }
                        if (xn == null && list.Count > 0)
                            xn = list[0] as XmlNode;
                    }
                }
                node.Node = xn;

                if (!(xn is XmlAttribute))
                {
                    view.Invalidate();
                    if (xn is XmlElement)
                    {
                        if (node.Children.Count <= 1)
                        {
                            this._img = ((int)NodeImage.Leaf - 1);
                        }
                    }
                }
            }
            finally
            {
                view.EndUpdate();
            }
            return node;
        }