xmlparser.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:4k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * xmlparser.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 VideoLAN
  5.  * $Id: xmlparser.cpp 7328 2004-04-12 17:08:58Z asmax $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #include "xmlparser.hpp"
  24. XMLParser::XMLParser( intf_thread_t *pIntf, const string &rFileName ):
  25.     SkinObject( pIntf )
  26. {
  27.     m_pReader = xmlNewTextReaderFilename( rFileName.c_str() );
  28.     if( !m_pReader )
  29.     {
  30.         msg_Err( getIntf(), "Failed to open %s for parsing",
  31.                  rFileName.c_str() );
  32.         return;
  33.     }
  34.     // Activate DTD validation
  35.     xmlTextReaderSetParserProp( m_pReader, XML_PARSER_DEFAULTATTRS, 1 );
  36.     xmlTextReaderSetParserProp( m_pReader, XML_PARSER_VALIDATE, 1 );
  37.     // Set the error handler
  38.     xmlTextReaderSetErrorHandler( m_pReader, handleError, this );
  39. }
  40. XMLParser::~XMLParser()
  41. {
  42.     if( m_pReader )
  43.     {
  44.         xmlFreeTextReader( m_pReader );
  45.     }
  46. }
  47. bool XMLParser::parse()
  48. {
  49.     if( !m_pReader )
  50.     {
  51.         return false;
  52.     }
  53.     m_errors = false;
  54.     int ret = xmlTextReaderRead( m_pReader );
  55.     while (ret == 1)
  56.     {
  57.         if( m_errors )
  58.         {
  59.             return false;
  60.         }
  61.         // Get the node type
  62.         int type = xmlTextReaderNodeType( m_pReader );
  63.         switch (type )
  64.         {
  65.             // Error
  66.             case -1:
  67.                 return false;
  68.                 break;
  69.             // Begin element
  70.             case 1:
  71.             {
  72.                 // Read the element name
  73.                 const xmlChar *eltName = xmlTextReaderConstName( m_pReader );
  74.                 if( !eltName )
  75.                 {
  76.                     return false;
  77.                 }
  78.                 // Read the attributes
  79.                 AttrList_t attributes;
  80.                 while( xmlTextReaderMoveToNextAttribute( m_pReader ) == 1 )
  81.                 {
  82.                     const xmlChar *name = xmlTextReaderConstName( m_pReader );
  83.                     const xmlChar *value = xmlTextReaderConstValue( m_pReader );
  84.                     if( !name || !value )
  85.                     {
  86.                         return false;
  87.                     }
  88.                     attributes[(const char*)name] = (const char*)value;
  89.                 }
  90.                 handleBeginElement( (const char*)eltName, attributes);
  91.                 break;
  92.             }
  93.             // End element
  94.             case 15:
  95.                 // Read the element name
  96.                 const xmlChar *eltName = xmlTextReaderConstName( m_pReader );
  97.                 if( !eltName )
  98.                 {
  99.                     return false;
  100.                 }
  101.                 handleEndElement( (const char*)eltName );
  102.                 break;
  103.         }
  104.         ret = xmlTextReaderRead( m_pReader );
  105.     }
  106.     return (ret == 0 && !m_errors );
  107. }
  108. void XMLParser::handleError( void *pArg,  const char *pMsg,
  109.                              xmlParserSeverities severity,
  110.                              xmlTextReaderLocatorPtr locator)
  111. {
  112.     XMLParser *pThis = (XMLParser*)pArg;
  113.     int line = xmlTextReaderLocatorLineNumber( locator );
  114.     msg_Err( pThis->getIntf(), "XML parser error (line %d) : %s", line, pMsg );
  115.     pThis->m_errors = true;
  116. }
  117.