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