RapidXML вызывает исключение parse_error - PullRequest
1 голос
/ 13 июня 2011

Когда я пытаюсь проанализировать простой XML-файл с использованием инфраструктуры RapidXML, он выдает ошибку parse_error по следующей причине: «ожидается <».Сейчас я практически впервые пишу XML-код, поэтому это может быть глупая синтаксическая ошибка, в этом случае потерпите меня :) Это мой <strong>xmlParser.h :

#ifndef __XML_PARSER_H__
#define __XML_PARSER_H__

#include "rapidxml.hpp"
#include "windowUtil.h"

class XmlParser
{
public:
    bool parse(char *xml)
    {
        try
        {
            doc.parse<0>(xml);
        }
        catch(rapidxml::parse_error &e)
        {
            msg_box(NULL, e.what(), "RapidXML exception!", MB_OK | MB_ICONERROR | MB_TASKMODAL);

            return false;
        }

        return true;
    }

    char* get_first_node_name()
    {
        return doc.first_node()->name();
    }
private:
    rapidxml::xml_document<> doc;
};

#endif

А вот как он называется и используется:

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
    XmlParser xmlParser;
    WindowFramework *window = create_window(&framework, NULL, NULL, "GAME");

    if(!init_window(window, true, true))
        return kill(1);
    if(!xmlParser.parse("./layouts/login_gui.xml"))
        return kill(1);

    framework.main_loop();

    return kill(0);
}

login_gui.xml :

<?xml version="1.0"?>
<button>
    <text>EXIT</text>
    <buttonready>button.png</buttonready>
    <buttonrollover>button_active.png</buttonrollover>
    <buttonpressed>button_pressed.png</buttonpressed>
    <buttoninactive>button_inactive.png</buttoninactive>
</button>

Ответы [ 2 ]

3 голосов
/ 13 июня 2011

Есть прекрасный документ об использовании RapidXML , на который я всегда ссылаюсь. Это необходимо прочитать!

Вот моя попытка прочитать первые узлы вашего документа (demo.xml).

string input_xml;
string line;
ifstream in("demo.xml");

// read file into input_xml
while(getline(in,line))
    input_xml += line;

// make a safe-to-modify copy of input_xml
// (you should never modify the contents of an std::string directly)
vector<char> xml_copy(input_xml.begin(), input_xml.end());
xml_copy.push_back('\0');

// only use xml_copy from here on!
xml_document<> doc;
// we are choosing to parse the XML declaration
// parse_no_data_nodes prevents RapidXML from using the somewhat surprising
// behavior of having both values and data nodes, and having data nodes take
// precedence over values when printing
// >>> note that this will skip parsing of CDATA nodes <<<
doc.parse<parse_declaration_node | parse_no_data_nodes>(&xml_copy[0]);

// we didn't keep track of our previous traversal, so let's start again
// we can match nodes by name, skipping the xml declaration entirely
xml_node<>* cur_node = doc.first_node("button");

// go straight to the first text node
cur_node = cur_node->first_node("text");
string text = cur_node->value(); // if the node doesn't exist, this line will crash
cout << text << endl;

// and then to the next node
cur_node = cur_node->next_sibling("buttonready");
string b_ready = cur_node->value();
cout << b_ready << endl;

// and then to the next node
// ...

Выводы:

EXIT
button.png

Если в будущем ваш XML станет более сложным, вы можете взглянуть на этот ответ:

Считать строку из XML-файла, используя C ++

, который показывает исходный код, который также считывает свойства из узлов.

3 голосов
/ 13 июня 2011

Метод parse принимает строку, содержащую XML, вы передаете ему имя файла. Ваше имя файла обрабатывается как данные XML, и, очевидно, это неправильно. Сначала вы должны прочитать файл, а затем вызвать parse для полученной строки.

Из документов RapidXML :

функция xml_document :: parse

Конспект

void parse(Ch *text); 

Описание

Разбирает XML с нулевым символом в конце строка в соответствии с заданными флагами.

Ваша пересмотренная структура может выглядеть примерно так:

bool parse(char *xmlFile)        
{            
     try            
     {  
        std::string xml(getXmlDataFromFile(xmlFile));
        doc.parse<0>(xml.c_str());            
     }  
...