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