/// <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); } }