• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

RapidXml, błędy w kodzie biblioteki

0 głosów
252 wizyt
pytanie zadane 14 sierpnia 2017 w C i C++ przez niezalogowany
edycja 14 sierpnia 2017

Pobrałem sobie RapidXml naszego rodaka stąd http://rapidxml.sourceforge.net/

(cztery pliku nagłówkowe, które załączyłem do mojego projektu).

Tak wygląda mój kod

#include <memory>
#include <iostream>
#include <fstream>
#include <vector>
#include "rapidxml.hpp"
#include "rapidxml_iterators.hpp"
#include "rapidxml_print.hpp"
#include "rapidxml_utils.hpp"

using namespace std;
using namespace rapidxml;

int main()
{
    // moj kod
    string zawartosc = "";
    fstream plik;
    string linia;
    plik.open("slowka.xml", ios::in);
    while(getline(plik,linia))
        zawartosc += linia;
    plik.close();

    // fragment z Manual, rozdział 2
    xml_document<> doc;    // character type defaults to char
    doc.parse<0>(zawartosc.c_str());    // 0 means default parse flags

    cout << "Name of my first node is: " << doc.first_node()->name() << "\n";
    xml_node<> *node = doc.first_node("foobar");
    cout << "Node foobar has value " << node->value() << "\n";
    for ( xml_attribute<> *attr = node->first_attribute(); attr; attr = attr->next_attribute() )
    {
        cout << "Node foobar has attribute " << attr->name() << " ";
        cout << "with value " << attr->value() << "\n";
    }

    return 0;
}

I wywala 21 błędów

http://zapisz.net/view.php?filename=728_przechwytywanie.png

Jak usunę mój kod i dam tak jak jest w manual czyli

doc.parse<0>(text);

To też nie działa, bo wiadomo, nie zadeklarowałem nigdzie zmiennej text (nie wiem jakiego typu ma niby być, jak const char* to przecież zawartosc.c_str() powinno działać), ale przede wszystkim wykazuje błędy w kodzie biblioteki.

Ktoś pomoże?

EDIT

Zmieniłem kod

typedef typename xml_node<Ch> value_type;
typedef typename xml_node<Ch> &reference;
typedef typename xml_node<Ch> *pointer;

na

typedef xml_node<Ch> value_type;
typedef xml_node<Ch> reference;
typedef xml_node<Ch> pointer;

i teraz jest jeden błąd związany z linijką

doc.parse<0>(zawartosc.c_str());    // 0 means default parse flags

no matching function...

1 odpowiedź

0 głosów
odpowiedź 15 sierpnia 2017 przez j23 Mędrzec (182,400 p.)
edycja 15 sierpnia 2017 przez j23

Wywal jedynie typename, & i * muszą zostać.

parse zmienia zawartość bufora podanego w parametrze, dlatego nie możesz jej dać adresu zwróconego przez c_str(). Zrób tak:

vector<char> v;
	
ifstream ifs("slowka.xml");

copy(istream_iterator<char>(ifs), istream_iterator<char>(), back_inserter(v));
v.push_back('\0');

doc.parse<0>(&v.front());
...

 

PS. nie jest to może najszybsza metoda czytania pliku do pamięci, ale na potrzeby przykładu wystarczająca.

Podobne pytania

0 głosów
0 odpowiedzi 88 wizyt
pytanie zadane 26 października 2020 w Inne języki przez Lyokoheros Początkujący (340 p.)
0 głosów
0 odpowiedzi 308 wizyt
pytanie zadane 7 lutego 2018 w JavaScript przez Anoonymous Obywatel (1,560 p.)
0 głosów
1 odpowiedź 820 wizyt
pytanie zadane 27 października 2016 w JavaScript przez Newperty Początkujący (280 p.)

89,082 zapytań

137,669 odpowiedzi

307,605 komentarzy

59,140 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...