Show
Ignore:
Timestamp:
01/11/10 18:36:03 (4 years ago)
Author:
robert
Message:

From Jean-Sebastien Guay, "OK, so here are new changes.

1. The node type will be set to ATOM on read of <tag prop="..." ... /> type tags.
2. GROUP and NODE are now written using the same code (and not just duplicated code). Also NODE will not be written as an ATOM if it has no children or contents, so you need to set the type to ATOM if you want the <tag ... /> style.
3. You had put the write of "/>" for ATOM after the "return true", so it had no effect... Moved to before the return.
4. ATOM did not write its properties correctly, fixed.
5. As an added bonus, I made the write() method indent the output so it's more readable. It brings a small public interface change but the indent argument has a default value so client code doesn't need to change (if there even is any).
6. Another added bonus, I've simplified the write() method a bit by factoring out the write for children and properties into protected methods."

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgDB/XmlParser.cpp

    r10930 r10943  
    308308                        ++input; 
    309309                        osg::notify(osg::INFO)<<"tag is closed correctly"<<std::endl; 
     310                        childNode->type = ATOM; 
    310311                    } 
    311312                    else  
     
    361362} 
    362363 
    363 bool XmlNode::write(std::ostream& fout) const 
     364bool XmlNode::write(std::ostream& fout, const std::string& indent) const 
    364365{ 
    365366    switch(type) 
     
    369370        case(ATOM): 
    370371        { 
    371             fout<<"<"<<name; 
    372             for(Properties::const_iterator oitr = properties.begin(); 
    373                 oitr != properties.end(); 
    374                 ++oitr) 
    375             { 
    376                 fout<<oitr->first<<"\""; 
    377                 writeString(fout,oitr->second); 
    378                 fout<<"\""<<std::endl; 
    379             } 
    380             return true; 
     372            fout<<indent<<"<"<<name; 
     373            writeProperties(fout); 
    381374            fout<<" />"<<std::endl; 
     375            return true; 
    382376        } 
    383377        case(ROOT): 
    384378        { 
    385             for(Children::const_iterator citr = children.begin(); 
    386                 citr != children.end(); 
    387                 ++citr) 
    388             { 
    389                 (*citr)->write(fout); 
    390             } 
     379            writeChildren(fout, indent); 
    391380            return true; 
    392381        } 
    393382        case(NODE): 
    394         { 
    395             fout<<"<"<<name; 
    396             for(Properties::const_iterator oitr = properties.begin(); 
    397                 oitr != properties.end(); 
    398                 ++oitr) 
    399             { 
    400                 fout<<" "<<oitr->first<<"=\""; 
    401                 writeString(fout,oitr->second); 
    402                 fout<<"\""; 
    403             } 
    404  
    405             if (children.empty() && contents.empty()) 
    406             { 
    407                 fout<<" />"<<std::endl; 
    408             } 
    409             else 
    410             { 
    411                 fout<<">"; 
    412                 for(Children::const_iterator citr = children.begin(); 
    413                     citr != children.end(); 
    414                     ++citr) 
    415                 { 
    416                     (*citr)->write(fout); 
    417                 } 
    418  
    419                 if (!contents.empty()) writeString(fout,contents); 
    420  
    421                 fout<<"</"<<name<<">"<<std::endl; 
    422             } 
    423             return true; 
    424         } 
    425383        case(GROUP): 
    426384        { 
    427             fout<<"<"<<name; 
    428             for(Properties::const_iterator oitr = properties.begin(); 
    429                 oitr != properties.end(); 
    430                 ++oitr) 
    431             { 
    432                 fout<<" "<<oitr->first<<"=\""; 
    433                 writeString(fout,oitr->second); 
    434                 fout<<"\""; 
    435             } 
     385            fout<<indent<<"<"<<name; 
     386            writeProperties(fout); 
    436387            fout<<">"<<std::endl; 
    437388 
    438             for(Children::const_iterator citr = children.begin(); 
    439                 citr != children.end(); 
    440                 ++citr) 
    441             { 
    442                 (*citr)->write(fout); 
    443             } 
    444  
    445             fout<<"</"<<name<<">"<<std::endl; 
     389            writeChildren(fout, indent + "  "); 
     390 
     391            fout<<indent<<"</"<<name<<">"<<std::endl; 
    446392            return true; 
    447393        } 
    448394        case(COMMENT): 
    449395        { 
    450             fout<<"<!--"<<contents<<"-->"<<std::endl; 
     396            fout<<indent<<"<!--"<<contents<<"-->"<<std::endl; 
    451397            return true; 
    452398        } 
    453399        case(INFORMATION): 
    454400        { 
    455             fout<<"<?"<<contents<<"?>"<<std::endl; 
     401            fout<<indent<<"<?"<<contents<<"?>"<<std::endl; 
    456402            return true; 
    457403        } 
     
    465411    return true; 
    466412} 
     413 
     414bool XmlNode::writeChildren(std::ostream& fout, const std::string& indent) const 
     415{ 
     416    for(Children::const_iterator citr = children.begin(); 
     417        citr != children.end(); 
     418        ++citr) 
     419    { 
     420        if (!(*citr)->write(fout, indent)) 
     421            return false; 
     422    } 
     423 
     424    return true; 
     425} 
     426 
     427bool XmlNode::writeProperties(std::ostream& fout) const 
     428{ 
     429    for(Properties::const_iterator oitr = properties.begin(); 
     430        oitr != properties.end(); 
     431        ++oitr) 
     432    { 
     433        fout<<" "<<oitr->first<<"=\""; 
     434        if (!writeString(fout,oitr->second)) 
     435            return false; 
     436        fout<<"\""; 
     437    } 
     438 
     439    return true; 
     440}