2012-01-01 13 views
5

के साथ पार्स एक्सएमएल मेरे पास निम्न XML फ़ाइल है और मैं इसे नीचे संरचनाओं का उपयोग करके स्टोर करना चाहता हूं।बढ़ावा संपत्ति पेड़

डेटा structs:

struct transitions 
    { 
    string oldstate; 
    string event; 
    string newstate; 
    }; 

    struct XML_Diagram 
    { 
    string diag_name; 
    string diag_defaultstate; 
    list<string> diag_states; 
    list<string> diag_events; 
    list<transitions> diag_transitions; 
    }; 

xml फ़ाइल:

<diagram> 
     <diagname>DiagaX</diagname> 
     <states> 
     <state>A</state> 
     .............  
     </states> 
     <events> 
      <event>ev1</event> 
      ................. 
     </events> 
     <defaultstate>A</defaultstate> 
     <transitions> 
      <transition> 
       <oldstate>A</oldstate> 
       <event>ev1</event> 
       <newstate>B</newstate> 
      </transition> 
      <transition> 
       <oldstate>B</oldstate> 
       <event>ev2</event> 
       <newstate>C</newstate> 
      </transition> 
      ......................... 
     </transitions> 
    </diagram> 

यह मेरे लिए स्पष्ट है कि कैसे मैं diagram.states तक पहुँचने के लिए कर सकते हैं। मैं folowing कोड के साथ कर सकते हैं:

using boost::property_tree::ptree; 
    ptree pt; 

    // Get diagram states 
    BOOST_FOREACH(ptree::value_type &v, pt.get_child("diagram.states")) 
    { 
     diag_states.push_back(v.second.data()); 
    } 

क्या मेरे लिए स्पष्ट नहीं है कि कैसे मैं स्तर diagram.transitions.transition में से डेटा का उपयोग कर सकते है?

मेरी समस्या यह है कि मुझे कई स्तरों के साथ अधिक जटिल xml फ़ाइलों को पार्स करने के तरीके पर दस्तावेज़ों में कोई उदाहरण नहीं मिला।

उत्तर

4

यह उपयोगी उपयोगिता समारोह को पार करता है और एक पूरी संपत्ति पेड़ बहुत-प्रिंट:

using boost::property_tree::ptree; 

std::string q(const std::string& s) { return "\"" + s + "\""; } 

void print_tree(const ptree& pt, int level) 
{ 
    const std::string sep(2 * level, ' '); 
    BOOST_FOREACH(const ptree::value_type &v, pt) { 
     std::cout 
      << sep 
      << q(v.first) << " : " << q(v.second.data()) << "\n"; 
     print_tree(v.second, level + 1); 
    } 
} 

void print_tree(const ptree& pt) { print_tree(pt, 0); } 

v.second मूल्यों पेड़ खुद कि हमेशा की तरह get तरीकों के साथ पहुँचा जा सकता है कर रहे हैं। उदाहरण के लिए संक्रमण कर सकते हैं पहुँचा जा और मुद्रित इस तरह:

namespace pt = boost::property_tree; 

// worker 
typedef std::pair<const pt::ptree&, unsigned> tree_printer; 

// empty ptree helper 
const pt::ptree& empty_ptree() 
{ 
    static pt::ptree t; 
    return t; 
} 


std::ostream& operator <<(std::ostream& os, const tree_printer& p) 
{ 
    const pt::ptree& tree = p.first; 

    if(tree.empty()) return os; 

    const std::string indent(p.second, ' '); 

    BOOST_FOREACH(const pt::ptree::value_type& v, tree) 
    { 
     const std::string& nodeName = v.first; 

     if(nodeName == "<xmlattr>") continue; 

     os << indent << nodeName; 
     const pt::ptree& attributes = 
      v.second.get_child("<xmlattr>", empty_ptree()); 

     if(!attributes.empty()) 
     { 
      os << " [ "; 
      BOOST_FOREACH(const pt::ptree::value_type& attr, attributes) 
      { 
       const std::string& attrName = attr.first; 
       const std::string& attrVal = attr.second.data(); 

       os << attrName << " = '" << attrVal << "'; "; 
      } 
      os << "]"; 
     } 
     os << "\n"; 

     const pt::ptree& childNode = v.second; 
     os << tree_printer(childNode, p.second + 1); 
    } 

    return os; 
} 


std::ostream& operator <<(std::ostream& os, const pt::ptree& tree) 
{ 
    os << tree_printer(tree, 0); 

    return os; 
} 

आशा इस मदद करता है:

using std::string; 

void print_transitions(const ptree& pt) 
{ 
    BOOST_FOREACH(
     const ptree::value_type &v, 
     pt.get_child("diagram.transitions")) 
    { 
     const ptree& child = v.second; 
     std::cout 
      << "Event " 
      << child.get<string>("event") 
      << " in state " 
      << child.get<string>("oldstate") 
      << " leads to state " 
      << child.get<string>("newstate") 
      << "\n"; 
    } 
} 
4

यहाँ कैसे विशेषताओं के साथ ptree मुद्रित करने के लिए का एक और उदाहरण है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^