Пример #1
0
bool Parser::parseProlog( Node *node )
{
    parseXMLDeclaration( node );
    while( parseMisc( node ) ) {}

    parseDocType( node );
    while( parseMisc( node ) ) {}

    return true;
}
Пример #2
0
static UXMLNODE parseElement(struct UXMLPARSER *parser, UXMLNODE parent, int *type)
{
  UXMLNODE node;
  UXMLCHAR *name = parser->offset;
  size_t nameLength;
  int isEmpty;

  if (!skipName(parser))
  {
    setError(parser, 0, "Unexpected end of input parsing stag name");
    return NULL;
  }

  nameLength = (parser->offset - name);

  switch (*name)
  {
  case '!':
    {
      if (stringCompare(name, "![CDATA[", 8))
      {
        *type = UXML_NT_CDATA;
        return parseCDATA(parser, parent);
      }
      else if (stringCompare(name, "!--", 3))
      {
        *type = UXML_NT_COMMENT;
        return parseComment(parser, parent);
      }
      else if (stringCompare(name, "!DOCTYPE", 8))
      {
        *type = UXML_NT_DOCTYPE;
        return parseDocType(parser, parent);
      }
      else
      {
        setError(parser, 0, "Unexpected ! tag");
        return NULL;
      }
      break;
    }

  case '?':
    {
      if (stringCompare(name, "?xml", 4))
      {
        *type = UXML_NT_PROLOG;
        return parseProlog(parser, parent);
      }
      else
      {
        setError(parser, 0, "Unexpected prolog tag");
        return NULL;
      }
      break;
    }

  default:
    {
      *type = UXML_NT_ELEMENT;
      node = parser->createElement(parser, parent, name, nameLength);

      if (!parseAttributes(parser, node, &isEmpty))
      {
        goto ERROR_DESTROY_NODE;
      }

      if (isEmpty)
      {
        parser->offset ++;
        if (*(parser->offset) != '>')
        {
          setError(parser, 0, "Unexpected end of input parsing stag name");
          goto ERROR_DESTROY_NODE;
        }

        parser->offset ++;
      }
      else
      {
        parser->offset ++;

        if (!parseContent(parser, node, name, nameLength))
        {
          goto ERROR_DESTROY_NODE;
        }
      }
      break;
    }
  }

  return node;

ERROR_DESTROY_NODE:
  parser->destroyNode(parser, node);
  return NULL;
}