2016-10-18 32 views
0

私はRapidXMLを使用してxmlの文字列を解析しています。 私の文字列があります:rapidxmlは1つのノード全体を解析します

std::string str("<?xml version=\"1.0\" encoding=\"UTF-8\" 
standalone=\"yes\"?><protocol version=\"1.5\"><srvResponse> 
<dateTime>2016-10-18T08:51:50.657+01:00</dateTime><responseFrom ag=\"1\"  
/><idMessage>0</idMessage><rejectionCode>0</rejectionCode> 
</srvResponse></protocol>"); 

そして、ここでは、私が解析しようとする方法である:

XML::xml_document<> doc; 
doc.parse<0>((char*) str.c_str()); 
XML::xml_node<>* firstNode = doc.first_node(); 

しかし、私が取得することは、それがただ一つのノードと同じように解析されていることである:、すなわち、兄弟プロトコルの子はヌルですが、単純にはありません。

私は1つの主要なものが欠けていると思います。

見つけて教えてくれませんか?

ありがとうございます。

答えて

1

あなたは、あなたが以下のように行うことができ、そのような「1.xml」として、XMLデータをファイルに保存することができます:

<?xml version="1.0" encoding="utf-8"?> 
<protocol version="1.5"> 
    <srvResponse> 
     <dateTime>2016-10-18T08:51:50.657+01:00</dateTime> 
     <responseFrom ag="1"/> 
     <idMessage>0</idMessage> 
     <rejectionCode>0</rejectionCode> 
    </srvResponse> 
</protocol> 


void ParseWithAtrribute(std::string strFilePath /*= "1.xml"*/) 
{ 
    rapidxml::file<> docFile(strFilePath.c_str()); 
    rapidxml::xml_document<> doc; 
    doc.parse<0>(docFile.data()); 

    rapidxml::xml_node<> *pRootNode = doc.first_node(); 
    if (pRootNode != NULL) 
    { 
     std::cout << pRootNode->name() << " " << pRootNode->value()<< std::endl; // protocol 
     rapidxml::xml_attribute<> *pAttr = pRootNode->first_attribute(); 
     if (pAttr != NULL) 
     { 
      std::cout << pAttr->name() << " " << pAttr->value() << std::endl; // version 
     } 

     rapidxml::xml_node<> *pChildNode = pRootNode->first_node(); 
     if (pChildNode != NULL) 
     { 
      std::cout << pChildNode->name() << " " << pChildNode->value() << std::endl; 
      rapidxml::xml_node<> * pSonNode = pChildNode->first_node(); 
      for(; pSonNode != NULL; pSonNode = pSonNode->next_sibling()) 
      { 
       std::cout << pSonNode->name() << " " << pSonNode->value() << std::endl; 
       rapidxml::xml_attribute<> *pSonAttr = pSonNode->first_attribute(); 
       if (pSonAttr != NULL) 
       { 
        std::cout << " " << pSonAttr->name() << ":" << pSonAttr->value() << std::endl; 
       } 
      } 
     } 
    } 
} 

を今、私たちは、XMLデータをファイルに保存する必要はありません。

void ParseWithAtrribute() 
{ 
    std::string str("<?xml version=\"1.0\" encoding=\"utf-8\"?> <protocol version=\"1.5\"> <srvResponse> <dateTime>2016-10-18T08:51:50.657+01:00</dateTime> <responseFrom ag=\"1\"/> <idMessage>0</idMessage> <rejectionCode>0</rejectionCode> </srvResponse> </protocol>"); 
    rapidxml::xml_document<> doc; 
    doc.parse<0>((char *)(str.c_str())); 

    rapidxml::xml_node<> *pRootNode = doc.first_node(); 
    if (pRootNode != NULL) 
    { 
     std::cout << pRootNode->name() << " " << pRootNode->value() << std::endl; // protocol 
     rapidxml::xml_attribute<> *pAttr = pRootNode->first_attribute(); 
     if (pAttr != NULL) 
     { 
      std::cout << pAttr->name() << " " << pAttr->value() << std::endl; // version 
     } 

     rapidxml::xml_node<> *pChildNode = pRootNode->first_node(); 
     if (pChildNode != NULL) 
     { 
      std::cout << pChildNode->name() << " " << pChildNode->value() << std::endl; 
      rapidxml::xml_node<> * pSonNode = pChildNode->first_node(); 
      for (; pSonNode != NULL; pSonNode = pSonNode->next_sibling()) 
      { 
       std::cout << pSonNode->name() << " " << pSonNode->value() << std::endl; 
       rapidxml::xml_attribute<> *pSonAttr = pSonNode->first_attribute(); 
       if (pSonAttr != NULL) 
       { 
        std::cout << " " << pSonAttr->name() << ":" << pSonAttr->value() << std::endl; 
       } 
      } 
     } 
    } 
} 
+0

ファイルに保存する余分な手順は必要ありません。あなたの答えは、文字列からまっすぐに解析する問題にも同様に当てはまります。 – acraig5075

+0

はい、あなたは正しいです! @ acraig5075 xmlデータをファイルに保存すると、xml形式のデータが表示されます – Bob

関連する問題