public XQueryDocumentBuilder(XQueryDocument doc) { m_document = doc; if (doc.pagefile == null) { m_pageFile = new PageFile(false); m_pageFile.HasSchemaInfo = true; doc.pagefile = m_pageFile; } else m_pageFile = doc.pagefile; NameTable = doc.nameTable; xmlns = NameTable.Get(XmlReservedNs.NsXmlNs); _state = WriteState.Start; if (doc.input == null) { _normalize = true; hs = new HashSet<object>(); NamespaceManager = new XmlNamespaceManager(NameTable); } SchemaInfo = null; DocumentRoot = new DmRoot(); _parent = DocumentRoot; _text = null; }
private void Read() { token.ThrowIfCancellationRequested(); if (lookahead || input.Read()) { if (documentRoot == null) { builder.WriteStartDocument(); documentRoot = builder.DocumentRoot; } lookahead = false; switch (input.NodeType) { case XmlNodeType.XmlDeclaration: break; case XmlNodeType.DocumentType: try { object documentType; string value = input.Value; if (value == "") documentType = DTDParser.ParseExternal(input.GetAttribute("PUBLIC"), input.GetAttribute("SYSTEM"), baseUri); else documentType = DTDParser.ParseInline(value, baseUri); CreateIdTable(documentType); } catch (XQueryException) { } break; case XmlNodeType.Element: builder.IsEmptyElement = input.IsEmptyElement; builder.WriteStartElement(input.Prefix, input.LocalName, input.NamespaceURI); string elemName = input.Name; while (input.MoveToNextAttribute()) { builder.WriteStartAttribute(input.Prefix, input.LocalName, input.NamespaceURI); builder.WriteString(input.Value); builder.WriteEndAttribute(); if (elemIdTable != null) { string name; if (elemIdTable.TryGetValue(elemName, out name) && name == input.Name) { if (IdTable == null) IdTable = new Dictionary<string, int>(); if (!IdTable.ContainsKey(input.Value)) IdTable.Add(input.Value, builder.Position); } } if (pagefile.HasSchemaInfo) { IXmlSchemaInfo schemaInfo = input.SchemaInfo; if (schemaInfo != null && schemaInfo.SchemaType != null) { XmlTypeCode typeCode = schemaInfo.SchemaType.TypeCode; if (typeCode == XmlTypeCode.Id) { if (IdTable == null) IdTable = new Dictionary<string, int>(); if (!IdTable.ContainsKey(input.Value)) IdTable.Add(input.Value, builder.Position); } } } } if (builder.IsEmptyElement) builder.WriteEndElement(); else { while (input.Read()) { if (input.NodeType == XmlNodeType.Text) builder.WriteString(input.Value); else if (input.NodeType == XmlNodeType.Whitespace) { if (preserveSpace) builder.WriteString(input.Value); } else if (input.NodeType == XmlNodeType.EndElement) { builder.WriteEndElement(); break; } else { builder.CompleteElement(); lookahead = true; break; } } } break; case XmlNodeType.EndElement: builder.WriteEndElement(); break; case XmlNodeType.Text: case XmlNodeType.CDATA: builder.WriteString(input.Value); break; case XmlNodeType.EntityReference: input.ResolveEntity(); break; case XmlNodeType.ProcessingInstruction: builder.WriteProcessingInstruction(input.LocalName, input.Value); break; case XmlNodeType.Comment: builder.WriteComment(input.Value); break; case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: if (preserveSpace) builder.WriteString(input.Value); break; } } else { builder.WriteEndDocument(); input.Close(); input = null; builder = null; } }