private bool ParseElementContent()
{
for (; ;)
{
int pos = _ps.charPos;
char[] chars = _ps.chars;
switch (chars[pos])
{
// some tag
case '<':
switch (chars[pos + 1])
{
// processing instruction
case '?':
_ps.charPos = pos + 2;
if (ParsePI())
{
return true;
}
continue;
case '!':
pos += 2;
if (_ps.charsUsed - pos < 2)
goto ReadData;
// comment
if (chars[pos] == '-')
{
if (chars[pos + 1] == '-')
{
_ps.charPos = pos + 2;
if (ParseComment())
{
return true;
}
continue;
}
else
{
ThrowUnexpectedToken(pos + 1, "-");
}
}
// CDATA section
else if (chars[pos] == '[')
{
pos++;
if (_ps.charsUsed - pos < 6)
{
goto ReadData;
}
if (XmlConvert.StrEqual(chars, pos, 6, "CDATA["))
{
_ps.charPos = pos + 6;
ParseCData();
return true;
}
else
{
ThrowUnexpectedToken(pos, "CDATA[");
}
}
else
{
if (ParseUnexpectedToken(pos) == "DOCTYPE")
{
Throw(SR.Xml_BadDTDLocation);
}
else
{
ThrowUnexpectedToken(pos, "<!--", "<[CDATA[");
}
}
break;
// element end tag
case '/':
_ps.charPos = pos + 2;
ParseEndElement();
return true;
default:
// end of buffer
if (pos + 1 == _ps.charsUsed)
{
goto ReadData;
}
else
{
// element start tag
_ps.charPos = pos + 1;
ParseElement();
return true;
}
}
break;
case '&':
if (ParseText())
{
return true;
}
continue;
default:
// end of buffer
if (pos == _ps.charsUsed)
{
goto ReadData;
}
else
{
// text node, whitespace or entity reference
if (ParseText())
{
return true;
}
continue;
}
}
ReadData:
// read new characters into the buffer
if (ReadData() == 0)
{
if (_ps.charsUsed - _ps.charPos != 0)
{
ThrowUnclosedElements();
}
if (!InEntity)
{
if (_index == 0 && _fragmentType != XmlNodeType.Document)
{
OnEof();
return false;
}
ThrowUnclosedElements();
}
if (HandleEntityEnd(true))
{
SetupEndEntityNodeInContent();
return true;
}
}
}
}