Esempio n. 1
0
        internal XMLElement ReadElement(string name)
        {
            XMLElement elem = new XMLElement(name);
            string attribute;
            int tkn;
            while (true)
            {
                switch (scanner.Scan())
                {
                    case XMLScanner.XML_GTS:
                        return elem;

                    case XMLScanner.XML_GT:
                        while ((tkn = scanner.Scan()) == XMLScanner.XML_LT)
                        {
                            if (scanner.Scan() != XMLScanner.XML_IDENT)
                            {
                                ThrowException("Element name expected");
                            }
                            string siblingName = scanner.Identifier;
                            XMLElement sibling = ReadElement(siblingName);
                            elem.AddSibling(sibling);
                        }
                        switch (tkn)
                        {
                            case XMLScanner.XML_SCONST:
                                elem.SetStringValue(scanner.String);
                                tkn = scanner.Scan();
                                break;

                            case XMLScanner.XML_ICONST:
                                elem.SetIntValue(scanner.Int);
                                tkn = scanner.Scan();
                                break;

                            case XMLScanner.XML_FCONST:
                                elem.SetRealValue(scanner.Real);
                                tkn = scanner.Scan();
                                break;

                            case XMLScanner.XML_IDENT:
                                if (scanner.Identifier.Equals("null"))
                                {
                                    elem.SetNullValue();
                                }
                                else
                                {
                                    elem.SetStringValue(scanner.Identifier);
                                }
                                tkn = scanner.Scan();
                                break;
                            }
                        if (tkn != XMLScanner.XML_LTS || scanner.Scan() != XMLScanner.XML_IDENT || !scanner.Identifier.Equals(name) || scanner.Scan() != XMLScanner.XML_GT)
                        {
                            ThrowException("Element is not closed");
                        }
                        return elem;

                    case XMLScanner.XML_IDENT:
                        attribute = scanner.Identifier;
                        if (scanner.Scan() != XMLScanner.XML_EQ || scanner.Scan() != XMLScanner.XML_SCONST)
                        {
                            ThrowException("Attribute value expected");
                        }
                        elem.AddAttribute(attribute, scanner.String);
                        continue;

                    default:
                        ThrowException("Unexpected token");
                        break;
                }
            }
        }