Rapidxml只解析一个整个节点
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
,即,兄弟姐妹,协议的子节点是空的,只是它没有。
我想我错过了一件重要的事。
你能找到并告诉我吗?
谢谢。
您可以将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数据保存到file:
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;
}
}
}
}
}
相关文章:
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 在C++的链表末尾插入一个节点
- 在单链表前面添加一个节点后,我无法遍历每个节点
- 删除链接列表中剩余的最后一个节点
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- C++循环链表删除,计数从下一个节点开始
- 如何删除上一个节点?
- 添加一个节点,并在通用树中的两个给定节点之间找到路径成本,其中c 中的儿童列表
- 我试图键入一个函数来在单链表的末尾添加一个节点,但不起作用
- 尝试指向链表中的上一个节点
- 取消下一个节点的空链接列表的头
- 删除最后一个节点,并将尾部更新到最后一个节点
- 计算列表中与线性链接列表中最后一个节点具有相同数据的节点的数量
- 从C++二进制搜索树中删除一个节点(类而非结构)
- 为什么我的原始二叉搜索树被修改,即使我在另一个节点中复制了根节点
- 如何在QT中获取XML文件的最后一个节点
- 交换C 中的第一个和最后一个节点
- 删除链表的每隔一个节点
- 尾部指向最后一个节点
- 使用循环在链接列表的前面插入一个节点