20#include "Teuchos_Assert.hpp"
102#define XMLPARSER_TFE( T , S ) \
103 TEUCHOS_TEST_FOR_EXCEPTION( T, std::runtime_error, "XML parse error at line " << _lineNo << ": " << S )
111 _entities[
"apos"] =
"'";
112 _entities[
"quot"] =
"\"";
113 _entities[
"lt"] =
"<";
114 _entities[
"gt"] =
">";
115 _entities[
"amp"] =
"&";
121 std::stack<string>
tags;
126 unsigned char c1,
c2;
133 if ( getSpace(
c1) ) {
140 if (_is->readBytes(&
c1,1) < 1) {
144 if (
c1 ==
'\n') ++_lineNo;
150 XMLPARSER_TFE( _is->readBytes(&
c2,1) < 1 ,
"stream ended in tag begin/end");
157 XMLPARSER_TFE(
curopen == 0,
"document not well-formed: encountered end element '" <<
tag <<
"' while not enclosed." );
158 XMLPARSER_TFE(
handler->endElement(
tag)!=0,
"document not well-formed: end element tag = '" <<
tag <<
"'"
159 <<
" did not match start element '" <<
tags.top()
165 else if (isLetter(
c2) ||
c2==
':' ||
c2==
'_') {
173 XMLPARSER_TFE(
gotRoot ==
true,
"document not well-formed: more than one root element specified" );
179 XMLPARSER_TFE(
handler->endElement(
tag)!=0,
"unknown failure from handler while processing tag '" <<
tag <<
"'" );
185 else if (
c2 ==
'?') {
187 XMLPARSER_TFE( assertChar(
'x') != 0 ,
"was expecting an XML declaration; element not well-formed or exploits unsupported feature" );
188 XMLPARSER_TFE( assertChar(
'm') != 0 ,
"was expecting an XML declaration; element not well-formed or exploits unsupported feature" );
189 XMLPARSER_TFE( assertChar(
'l') != 0 ,
"was expecting an XML declaration; element not well-formed or exploits unsupported feature" );
190 ignoreXMLDeclaration();
192 else if (
c2 ==
'!') {
198 XMLPARSER_TFE( assertChar(
'-') != 0 ,
"element not well-formed or exploits unsupported feature" );
199 XMLPARSER_TFE( assertChar(
'-') != 0 ,
"element not well-formed or exploits unsupported feature" );
203 XMLPARSER_TFE(
true,
"element not well-formed or exploits unsupported feature" );
206 else if ( (
curopen > 0) && (
c1 ==
'&') ) {
207 std::string
chars =
"";
212 std::string
chars =
"";
217 XMLPARSER_TFE(1 ,
"document not well-formed: character data outside of an enclosing tag");
221 XMLPARSER_TFE(
curopen != 0 ,
"file ended before closing element '" <<
tags.top() <<
"' from line " <<
tagLineStarts.top() );
228void XMLParser::getETag(std::string &
tag)
241 XMLPARSER_TFE( _is->readBytes(&
c,1) < 1 ,
"EOF before end element was terminated");
242 XMLPARSER_TFE( !isLetter(
c) &&
c!=
'_' &&
c!=
':' ,
"tag not well-formed");
245 XMLPARSER_TFE( _is->readBytes(&
c,1) < 1 ,
"EOF before end element was terminated");
246 if ( isNameChar(
c) ) {
248 XMLPARSER_TFE(1,
"end element not well-formed: expected '>'");
252 else if (isSpace(
c)) {
255 if (
c ==
'\n') ++_lineNo;
262 XMLPARSER_TFE(1,
"end element not well-formed");
296 XMLPARSER_TFE( _is->readBytes(&
c,1) < 1 ,
"EOF before start element was terminated");
314 XMLPARSER_TFE( getSpace(
c)!=0,
"EOF before start element was terminated");
318 if ( (isLetter(
c) ||
c==
'_' ||
c==
':') &&
hadspace ) {
325 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before start element was terminated");
326 if ( isNameChar(
c) ) {
329 else if ( isSpace(
c) ||
c==
'=' ) {
333 XMLPARSER_TFE(1,
"attribute not well-formed: expected whitespace or '='");
343 XMLPARSER_TFE(1,
"attribute not well-formed: expected '='");
347 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before start element was terminated");
358 else if (
c ==
'\"') {
362 XMLPARSER_TFE(1,
"attribute value must be quoted with either ''' or '\"'");
365 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before start element was terminated");
370 else if (!
apost &&
c==
'\"') {
374 else if (
c ==
'&' ) {
385 XMLPARSER_TFE(1,
"invalid character in attribute value");
390 XMLPARSER_TFE(
attrs.find(
attname) !=
attrs.end() ,
"cannot have two attributes with the same name");
398 XMLPARSER_TFE(assertChar(
'>')!=0,
"empty element tag not well-formed: expected '>'");
403 XMLPARSER_TFE(1,
"start element not well-formed: invalid character");
407 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before start element was terminated");
413void XMLParser::getComment(
long )
424 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before terminating comment begun at line " << _lineNo );
425 if (
c ==
'\n') ++_lineNo;
429 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before terminating comment begun at line " << _lineNo );
430 if (
c ==
'\n') ++_lineNo;
433 XMLPARSER_TFE( assertChar(
'>')!=0,
"comment not well-formed: missing expected '>' at line " << _lineNo );
436 else if (!isChar(
c)) {
437 XMLPARSER_TFE(1,
"comment not well-formed: invalid character at line " << _lineNo );
440 else if (!isChar(
c)) {
441 XMLPARSER_TFE(1,
"comment not well-formed: invalid character at line " << _lineNo );
447void XMLParser::getReference(std::string &
refstr) {
450 unsigned int num, base;
453 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before reference was terminated");
459 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before reference was terminated");
464 else if (
'0' <=
c &&
c <=
'9') {
469 XMLPARSER_TFE(1,
"invalid character in character reference: expected 'x' or [0-9]");
473 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before reference was terminated");
474 XMLPARSER_TFE(
c !=
';' && !(
'0' <=
c &&
c <=
'9') ,
"invalid character in character reference: expected [0-9] or ';'");
480 XMLPARSER_TFE(
num > 0xFF,
"character reference value out of range");
483 else if (isLetter(
c) ||
c==
'_' ||
c==
':') {
489 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before reference was terminated");
493 else if ( isLetter(
c) || (
'0' <=
c &&
c <=
'9')
494 ||
c==
'.' ||
c==
'-' ||
c==
'_' ||
c==
':'
499 XMLPARSER_TFE(1,
"entity reference not well-formed: invalid character");
502 XMLPARSER_TFE( _entities.find(
entname) == _entities.end(),
"entity reference not well-formed: undefined entity");
506 XMLPARSER_TFE(1,
"reference not well-formed: expected name or '#'");
511int XMLParser::getSpace(
unsigned char &
lookahead) {
524bool XMLParser::isLetter(
unsigned char c) {
525 if ( (0x41 <=
c &&
c <= 0x5A) || (0x61 <=
c &&
c <= 0x7A) ||
526 (0xC0 <=
c &&
c <= 0xD6) || (0xD8 <=
c &&
c <= 0xF6) ||
535bool XMLParser::isNameChar(
unsigned char c) {
536 if ( isLetter(
c) || (
'0' <=
c &&
c <=
'9') ||
537 c==
'.' ||
c==
'-' ||
c==
'_' ||
c==
':' ||
c==0xB7 )
545bool XMLParser::isSpace(
unsigned char c) {
546 if (
c==0x20 ||
c==0x9 ||
c==0xD ||
c==0xA )
554bool XMLParser::isChar(
unsigned char c) {
555 if (
c==0x9 ||
c==0xA ||
c==0xD || 0x20 <=
c) {
562int XMLParser::assertChar(
unsigned char cexp)
568 if (_is->readBytes(&
c,1) < 1) {
577void XMLParser::ignoreXMLDeclaration()
584 XMLPARSER_TFE(_is->readBytes(&
c,1) < 1,
"EOF before terminating XML declaration begun at line " << _lineNo );
585 if (
c ==
'\n') ++_lineNo;
589 XMLPARSER_TFE( assertChar(
'>')!=0,
"XML declaration not well-formed: missing expected '>' at line " << _lineNo );
Defines a class for assembling an XMLObject from XML input.
A class providing a simple XML parser. Methods can be overloaded to exploit external XML parsing libr...
Smart reference counting pointer class for automatic garbage collection.
TreeBuildingXMLHandler assembles a XMLObject from your XML input.
Representation of an XML data tree. XMLObject is a ref-counted handle to a XMLObjectImplem object,...
XMLObject parse()
Consume the XMLInputStream to build an XMLObject.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.