Rapidxml анализирует только один целый узел

Я использую 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, т.е. братья и сестры, дети протокола равны нулю, просто его нет.

Мне кажется, я упускаю одну принципиальную вещь.

Не могли бы вы найти и сказать мне?

Спасибо.


person Mert Mertce    schedule 18.10.2016    source источник


Ответы (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;
                }
            }
        }
    }
}
person Bob    schedule 16.01.2017
comment
Нет необходимости в этом дополнительном шаге сохранения в файл. Ваш ответ в равной степени применим к вопросу разбора прямо из строки. - person acraig5075; 16.01.2017
comment
Да ты прав! @acraig5075 acraig5075 Сохранить XML-данные в файл на востоке, чтобы увидеть формат XML-данных. - person Bob; 17.01.2017