[英]rapidxml parses just one whole node
我正在使用RapidXML解析xml字符串。 有我的字符串:
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();
但是,我得到的是,它只像一个节点一样被解析: protocol
,即兄弟姐妹,protocol的子代为null,而根本没有。
我想我缺少一件事。
你能找到并告诉我吗?
谢谢。
您可以将XML数据保存到文件中,例如“ 1.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;
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.