void CanvasComponent::initFromXml(const XmlTree& xml, bool createNodes) { id = xml.getAttributeValue<int>("id"); // when loading a patch, update globalID so future // nodes will be created with a unique id if (globalComponentID <= id) { // increment global id so each component will have a unique id globalComponentID = id+1; } setName(xml.getAttributeValue<std::string>("name")); Vec2f pos = Vec2f(xml.getAttributeValue<float>("position.x"), xml.getAttributeValue<float>("position.y")); Vec2f size = Vec2f(xml.getAttributeValue<float>("size.x"), xml.getAttributeValue<float>("size.y")); canvasRect = Rectf(pos, pos+size); setSize(size); showInputPlus = xml.getAttributeValue<bool>("showInputPlus"); showOutputPlus = xml.getAttributeValue<bool>("showOutputPlus"); if (createNodes) { // add inputs and outputs XmlTree inputNodesTree = xml.getChild("InputNodes"); for(XmlTree::ConstIter iter = inputNodesTree.begin(); iter != inputNodesTree.end(); ++iter) { if (iter->getTag() == "Node") { addInputNodeFromXml(iter->getChild("")); } } XmlTree outputNodesTree = xml.getChild("OutputNodes"); for(XmlTree::ConstIter iter = outputNodesTree.begin(); iter != outputNodesTree.end(); ++iter) { if (iter->getTag() == "Node") { addOutputNodeFromXml(iter->getChild("")); } } } }
void XMLTestApp::setup() { XmlTree doc( loadFile( getAssetPath( "library.xml" ) ) ); XmlTree musicLibrary( doc.getChild( "library" ) ); for( XmlTree::ConstIter item = doc.begin("library/album"); item != doc.end(); ++item ) { console() << "Node: " << item->getTag() << " Value: " << item->getValue() << endl; } for( XmlTree::ConstIter track = doc.begin("library/album/track"); track != doc.end(); ++track ) console() << track->getValue() << endl; assert( (musicLibrary / "album")["musician"] == "John Coltrane" ); // test that /one/two is equivalent to one/two vector<string> noLeadingSeparator, leadingSeparator; for( XmlTree::ConstIter track = doc.begin("library/album/track"); track != doc.end(); ++track ) noLeadingSeparator.push_back( track->getValue() ); for( XmlTree::ConstIter track = doc.begin("/library/album/track"); track != doc.end(); ++track ) leadingSeparator.push_back( track->getValue() ); assert( noLeadingSeparator == leadingSeparator ); XmlTree firstAlbum = doc.getChild( "library/album" ); for( XmlTree::Iter child = firstAlbum.begin(); child != firstAlbum.end(); ++child ) { console() << "Tag: " << child->getTag() << " Value: " << child->getValue() << endl; } console() << doc.getChild( "library/owner/city" ); XmlTree ownerCity = doc.getChild( "///library/////owner/city" ); console() << "Path: " << ownerCity.getPath() << " Value: " << ownerCity.getValue() << std::endl; console() << doc; console() << findTrackNamed( doc.getChild( "library" ), "Wolf" ); // Whoops - assignment by value doesn't modifying the original XmlTree XmlTree firstTrackCopy = doc.getChild( "/library/album/track" ); firstTrackCopy.setValue( "Replacement name" ); console() << doc.getChild( "/library/album/track" ) << std::endl; XmlTree &firstTrackRef = doc.getChild( "/library/album/track" ); firstTrackRef.setValue( "Replacement name" ); console() << doc.getChild( "/library/album/track" ) << std::endl; XmlTree albumCopy = copyFirstAlbum( doc / "library" ); console() << ( albumCopy / "track" ).getPath() << std::endl; // should print 'newRoot/track' // This code only works in VC2010 /* std::for_each( doc.begin( "library/album" ), doc.end(), []( const XmlTree &child ) { app::console() << child.getChild( "title" ).getValue() << std::endl; } );*/ }
void ConfigDict::loadXML(DataSourceRef source) { XmlTree doc; try { doc = XmlTree(source); } catch(rapidxml::parse_error &e) { LOG_ERROR("ConfigDict::loadXML - couldnt parse XML data ("<< "error: "<< e.what() <<" "<< "file: "<< source->getFilePathHint() << ")"); } XmlTree root = *doc.begin(); for(XmlTree::ConstIter setting = root.begin(); setting != root.end(); ++setting) { string key = setting->getTag(); string value = setting->getValue(); settings.insert(std::pair<string,string>(key, value) ); } }