void parse_file( bool do_html, istream& input_stream, ostream& output_stream ) { DomParser parser; parser.set_substitute_entities( true ); parser.parse_stream( input_stream ); if ( parser ) { /* if succesfull create output */ const Element * rootNode = parser.get_document()->get_root_node(); if ( rootNode == NULL ) { throw runtime_error( "get_root_node() failed" ); } OutputBuilder* b; if ( do_html ) { b = new HtmlBuilder( output_stream ); } else { b = new LatexBuilder( output_stream ); } /* do stuff */ { const Element & root_in = dynamic_cast<const Element &>( *rootNode ); if ( root_in.get_name() != "document" ) { throw runtime_error( "root node must be document" ); } OutputState * s = b->create_root(); Node::NodeList list = root_in.get_children(); for ( Node::NodeList::iterator iter = list.begin(); iter != list.end(); ++iter ) { if ( *iter != NULL ) { parse_node( **iter, * s ); } } s->finish(); delete s; } delete b; } }
iPackage* JispParser::parse(const FindFile::Found& defFile) { using namespace xmlpp; // parsujemy xmla z definicjami DomParser parser; parser.set_substitute_entities(); Node* rootNode; Node* metaNode; Node::NodeList icons; Node::NodeList nodes; Attribute* attrib; eMSet result; ifstream file(defFile.getFilePath().c_str()); try { parser.parse_stream(file); } catch (const xmlpp::exception& e) { throw XMLParserException(e.what()); } file.close(); rootNode = parser.get_document()->get_root_node(); if (rootNode->get_name() != "icondef") throw WrongFormat("Z³a nazwa korzenia dokumentu (z³y format ?)"); nodes = rootNode->get_children("meta"); if (nodes.size() != 1) throw WrongFormat("Nie ma dok³adnie jednego elementu 'meta'"); metaNode = *nodes.begin(); if (!metaNode) throw WrongFormat("Element 'meta' nie zawiera dzieci"); nodes = metaNode->get_children("name"); if (nodes.size() == 1 && dynamic_cast<Element*>(*nodes.begin())) { result.setName(dynamic_cast<Element*>(*nodes.begin())->get_child_text()->get_content().c_str()); } nodes = metaNode->get_children("version"); if (nodes.size() == 1 && dynamic_cast<Element*>(*nodes.begin())) { result.setVersion(dynamic_cast<Element*>(*nodes.begin())->get_child_text()->get_content().c_str()); } nodes = metaNode->get_children("description"); if (nodes.size() == 1 && dynamic_cast<Element*>(*nodes.begin())) { result.setDescription(dynamic_cast<Element*>(*nodes.begin())->get_child_text()->get_content().c_str()); } nodes = metaNode->get_children("author"); for (Node::NodeList::iterator it = nodes.begin(); it != nodes.end(); it++) { if (dynamic_cast<Element*>(*it)) { attrib = dynamic_cast<Element*>(*it)->get_attribute("jid"); result.addAuthor(eMAuthor(dynamic_cast<Element*>(*it)->get_child_text()->get_content().c_str(), attrib ? attrib->get_value().c_str() : "")); } } nodes = metaNode->get_children("creation"); if (nodes.size() == 1 && dynamic_cast<Element*>(*nodes.begin())) { // result.setCTime(dynamic_cast<Element*>(*nodes.begin())->get_child_text()->get_content().c_str()); } nodes = metaNode->get_children("home"); if (nodes.size() == 1 && dynamic_cast<Element*>(*nodes.begin())) { result.setUrl(dynamic_cast<Element*>(*nodes.begin())->get_child_text()->get_content().c_str()); } icons = rootNode->get_children("icon"); for (Node::NodeList::iterator it = icons.begin(); it != icons.end(); it++) { eM emot(true, false); string mime; nodes = (*it)->get_children("object"); for (Node::NodeList::iterator it = nodes.begin(); it != nodes.end(); it++) { if (dynamic_cast<Element*>(*it) && dynamic_cast<Element*>(*it)->get_attribute("mime")) { mime = dynamic_cast<Element*>(*it)->get_attribute("mime")->get_value(); if (mime == "image/png" || mime == "image/gif" || mime == "image/jpeg") { emot.setImgPath(defFile.getDirectory() + (string) dynamic_cast<Element*>(*it)->get_child_text()->get_content()); break; } mime.clear(); } } if (mime.empty()) continue; nodes = (*it)->get_children("text"); if (nodes.empty()) throw WrongFormat("Brak tekstu do zamiany"); for (Node::NodeList::iterator it = nodes.begin(); it != nodes.end(); it++) { if (dynamic_cast<Element*>(*it)) { emot.setText(dynamic_cast<Element*>(*it)->get_child_text()->get_content().c_str()); attrib = dynamic_cast<Element*>(*it)->get_attribute("regexp"); if (attrib) { emot.setPreg((bool) atoi(attrib->get_value().c_str())); } result.addEmot(emot); } } } return new eMSet(result); }