/// <summary>
        /// Start construction of a new document.  This must be called before any other methods are called.
        /// It may also be called after Close(), in order to build further documents.
        /// </summary>
        public void Initialize(XPathDocument doc, IXmlLineInfo lineInfo, string baseUri, XPathDocument.LoadFlags flags)
        {
            XPathNode[] page;
            int         idx;

            _doc           = doc;
            _nameTable     = doc.NameTable;
            _atomizeNames  = (flags & XPathDocument.LoadFlags.AtomizeNames) != 0;
            _idxParent     = _idxSibling = 0;
            _elemNameIndex = new XPathNodeRef[ElementIndexSize];

            // Prepare line number information
            _textBldr.Initialize(lineInfo);
            _lineInfo    = lineInfo;
            _lineNumBase = 0;
            _linePosBase = 0;

            // Allocate the atomization table
            _infoTable = new XPathNodeInfoTable();

            // Allocate singleton collapsed text node
            idx = NewNode(out page, XPathNodeType.Text, string.Empty, string.Empty, string.Empty, string.Empty);
            _doc.SetCollapsedTextNode(page, idx);

            // Allocate xmlns:xml namespace node
            _idxNmsp = NewNamespaceNode(out _pageNmsp, _nameTable.Add("xml"), _nameTable.Add(XmlConst.ReservedNsXml), null, 0);
            _doc.SetXmlNamespaceNode(_pageNmsp, _idxNmsp);

            if ((flags & XPathDocument.LoadFlags.Fragment) == 0)
            {
                // This tree has a document root node
                _idxParent = NewNode(out _pageParent, XPathNodeType.Root, string.Empty, string.Empty, string.Empty, baseUri);
                _doc.SetRootNode(_pageParent, _idxParent);
            }
            else
            {
                // This tree is an XQuery fragment (no document root node), so root will be next node in the current page
                _doc.SetRootNode(_nodePageFact.NextNodePage, _nodePageFact.NextNodeIndex);
            }
        }
 public XPathDocumentBuilder(XPathDocument doc, IXmlLineInfo lineInfo, string baseUri, XPathDocument.LoadFlags flags)
 {
     this.nodePageFact.Init(0x100);
     this.nmspPageFact.Init(0x10);
     this.stkNmsp = new Stack <XPathNodeRef>();
     this.Initialize(doc, lineInfo, baseUri, flags);
 }
        /// <summary>
        /// Create a new XPathDocumentBuilder which creates nodes in "doc".
        /// </summary>
        public XPathDocumentBuilder(XPathDocument doc, IXmlLineInfo lineInfo, string baseUri, XPathDocument.LoadFlags flags)
        {
            // Allocate the initial node (for non-namespaces) page, and the initial namespace page
            _nodePageFact.Init(256);
            _nmspPageFact.Init(16);

            _stkNmsp = new Stack <XPathNodeRef>();

            Initialize(doc, lineInfo, baseUri, flags);
        }
        public void Initialize(XPathDocument doc, IXmlLineInfo lineInfo, string baseUri, XPathDocument.LoadFlags flags)
        {
            XPathNode[] nodeArray;
            this.doc           = doc;
            this.nameTable     = doc.NameTable;
            this.atomizeNames  = (flags & XPathDocument.LoadFlags.AtomizeNames) != XPathDocument.LoadFlags.None;
            this.idxParent     = this.idxSibling = 0;
            this.elemNameIndex = new XPathNodeRef[0x40];
            this.textBldr.Initialize(lineInfo);
            this.lineInfo    = lineInfo;
            this.lineNumBase = 0;
            this.linePosBase = 0;
            this.infoTable   = new XPathNodeInfoTable();
            int idxText = this.NewNode(out nodeArray, XPathNodeType.Text, string.Empty, string.Empty, string.Empty, string.Empty);

            this.doc.SetCollapsedTextNode(nodeArray, idxText);
            this.idxNmsp = this.NewNamespaceNode(out this.pageNmsp, this.nameTable.Add("xml"), this.nameTable.Add("http://www.w3.org/XML/1998/namespace"), null, 0);
            this.doc.SetXmlNamespaceNode(this.pageNmsp, this.idxNmsp);
            if ((flags & XPathDocument.LoadFlags.Fragment) == XPathDocument.LoadFlags.None)
            {
                this.idxParent = this.NewNode(out this.pageParent, XPathNodeType.Root, string.Empty, string.Empty, string.Empty, baseUri);
                this.doc.SetRootNode(this.pageParent, this.idxParent);
            }
            else
            {
                this.doc.SetRootNode(this.nodePageFact.NextNodePage, this.nodePageFact.NextNodeIndex);
            }
        }