00001 /* 00002 * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By 00003 * downloading, copying, installing or using the software you agree to 00004 * this license. If you do not agree to this license, do not download, 00005 * install, copy or use the software. 00006 * 00007 * Intel Open Source License 00008 * 00009 * Copyright (c) 2006 Intel Corporation. All rights reserved. 00010 * 00011 * Redistribution and use in source and binary forms, with or without 00012 * modification, are permitted provided that the following conditions are 00013 * met: 00014 * 00015 * Redistributions of source code must retain the above copyright 00016 * notice, this list of conditions and the following disclaimer. 00017 * 00018 * Redistributions in binary form must reproduce the above copyright 00019 * notice, this list of conditions and the following disclaimer in the 00020 * documentation and/or other materials provided with the distribution. 00021 * 00022 * Neither the name of the Intel Corporation nor the names of its 00023 * contributors may be used to endorse or promote products derived from 00024 * this software without specific prior written permission. 00025 * 00026 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00027 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00028 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 00029 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR 00030 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00031 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00032 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00033 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00034 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00035 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00036 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00037 */ 00038 00039 #include "config.h" 00040 00041 #ifdef LIBEXPAT_ENABLED 00042 00043 #include "ExpatXMLParser.h" 00044 #include "XMLDocument.h" 00045 #include "XMLObject.h" 00046 00047 namespace oasys { 00048 00049 //---------------------------------------------------------------------- 00050 ExpatXMLParser::ExpatXMLParser(const char* logpath) 00051 : Logger("ExpatXMLParser", logpath) 00052 { 00053 } 00054 00055 //---------------------------------------------------------------------- 00056 ExpatXMLParser::~ExpatXMLParser() 00057 { 00058 } 00059 00060 //---------------------------------------------------------------------- 00061 bool 00062 ExpatXMLParser::parse(XMLDocument* doc, const std::string& data) 00063 { 00064 XML_Parser p = XML_ParserCreate(NULL); 00065 00066 // set up the expat handlers 00067 XML_SetUserData(p, this); 00068 XML_SetElementHandler(p, start_element, end_element); 00069 XML_SetCharacterDataHandler(p, character_data); 00070 00071 // cache the document and null out the object 00072 doc_ = doc; 00073 cur_ = NULL; 00074 00075 if (XML_Parse(p, data.c_str(), data.length(), true) != XML_STATUS_OK) { 00076 log_err("parse error at line %d:\n%s", 00077 XML_GetCurrentLineNumber(p), 00078 XML_ErrorString(XML_GetErrorCode(p))); 00079 return false; 00080 } 00081 00082 return true; 00083 } 00084 00085 //---------------------------------------------------------------------- 00086 void XMLCALL 00087 ExpatXMLParser::start_element(void* data, 00088 const char* element, 00089 const char** attr) 00090 { 00091 ExpatXMLParser* this2 = (ExpatXMLParser*)data; 00092 00093 XMLObject* new_object = new XMLObject(element); 00094 if (this2->cur_ == NULL) { 00095 this2->doc_->set_root(new_object); 00096 } else { 00097 this2->cur_->add_element(new_object); 00098 } 00099 00100 this2->cur_ = new_object; 00101 while (attr[0] != NULL) { 00102 ASSERT(attr[1] != NULL); 00103 this2->cur_->add_attr(attr[0], attr[1]); 00104 attr += 2; 00105 } 00106 } 00107 00108 //---------------------------------------------------------------------- 00109 void XMLCALL 00110 ExpatXMLParser::end_element(void* data, 00111 const char* element) 00112 { 00113 ExpatXMLParser* this2 = (ExpatXMLParser*)data; 00114 ASSERT(this2->cur_->tag() == element); 00115 this2->cur_ = this2->cur_->parent(); 00116 } 00117 00118 //---------------------------------------------------------------------- 00119 void XMLCALL 00120 ExpatXMLParser::character_data(void* data, 00121 const XML_Char* s, 00122 int len) 00123 { 00124 ExpatXMLParser* this2 = (ExpatXMLParser*)data; 00125 ASSERT(this2->cur_ != NULL); 00126 this2->cur_->add_text(s, len); 00127 } 00128 00129 } // namespace oasys 00130 00131 #endif /* LIBEXPAT_ENABLED */
1.5.1