Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
        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;
            }
        }