Пример #1
0
        internal XMLElement readElement(System.String name)
        {
            XMLElement elem = new XMLElement(name);
            System.String attribute;
            XMLScanner.Token tkn;
            while (true)
            {
                switch (scanner.scan())
                {
                    case XMLScanner.Token.GTS:
                        return elem;

                    case XMLScanner.Token.GT:
                        while ((tkn = scanner.scan()) == XMLScanner.Token.LT)
                        {
                            if (scanner.scan() != XMLScanner.Token.IDENT)
                            {
                                throwException("Element name expected");
                            }
                            System.String siblingName = scanner.Identifier;
                            XMLElement sibling = readElement(siblingName);
                            elem.addSibling(sibling);
                        }
                        switch (tkn)
                        {
                            case XMLScanner.Token.SCONST:
                                elem.StringValue = scanner.String;
                                tkn = scanner.scan();
                                break;

                            case XMLScanner.Token.ICONST:
                                elem.IntValue = scanner.Int;
                                tkn = scanner.scan();
                                break;

                            case XMLScanner.Token.FCONST:
                                elem.RealValue = scanner.Real;
                                tkn = scanner.scan();
                                break;

                            case XMLScanner.Token.IDENT:
                                if (scanner.Identifier.Equals("null"))
                                {
                                    elem.setNullValue();
                                }
                                else
                                {
                                    elem.StringValue = scanner.Identifier;
                                }
                                tkn = scanner.scan();
                                break;

                        }
                        if (tkn != XMLScanner.Token.LTS || scanner.scan() != XMLScanner.Token.IDENT || !scanner.Identifier.Equals(name) || scanner.scan() != XMLScanner.Token.GT)
                        {
                            throwException("Element is not closed");
                        }
                        return elem;

                    case XMLScanner.Token.IDENT:
                        attribute = scanner.Identifier;
                        if (scanner.scan() != XMLScanner.Token.EQ || scanner.scan() != XMLScanner.Token.SCONST)
                        {
                            throwException("Attribute value expected");
                        }
                        elem.addAttribute(attribute, scanner.String);
                        continue;

                    default:
                        throwException("Unexpected token");
                        break;

                }
            }
        }