【问题标题】:rapidxml parses just one whole noderapidxml 只解析一个完整的节点
【发布时间】:2016-10-18 11:21:13
【问题描述】:

我正在使用 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,即协议的兄弟姐妹、孩子为空,根本没有。

我想我错过了一件主要的事情。

你能找到并告诉我吗?

谢谢。

【问题讨论】:

    标签: c++ rapidxml


    【解决方案1】:

    您可以将 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;
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 不需要保存到文件的额外步骤。您的回答同样适用于直接从字符串解析的问题。
    • 是的,你是对的! @acraig5075 将xml数据保存到文件是东看xml数据的格式
    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多