2010-03-12 9 views
7

RapidXML to szybki, lekki parser DOM XML C++, ale ma pewne dziwactwa.Jak naprawić problemy z właścicielem ciągów RapidXML?

Najgorszym z nich moim zdaniem jest to:

3,2 Własność łańcuchów.

Węzły i atrybuty produkowane przez RapidXml nie mają wartości nazw ani łańcuchów wartości. Oni tylko trzymają wskaźniki do nich. Ten numer oznacza, że ​​należy zachować ostrożność, ustawiając te wartości ręcznie, używając , używając funkcji lub xml_base::value(const Ch *).

Należy zachować ostrożność, aby upewnić się, że czas życia ciągu znaków jest co najmniej równy długości okresu ważności węzła/atrybutu . Najprostszym sposobem na uzyskanie jest przydzielenie ciągu z memory_pool należącego do dokumentu . Użyj do tego celu funkcji memory_pool::allocate_string() .

Teraz rozumiem, że jest to zrobione w ten sposób dla prędkości, ale to wydaje się jak katastrofa samochodowa czeka się wydarzyć. Poniższy kod wygląda niewinnie, ale "name" i "value" są poza zakresem, gdy foo zwraca, więc dokument jest niezdefiniowany.

void foo() 
{ 
    char name[]="Name"; 
    char value[]="Value"; 

    doc.append_node(doc.allocate_node(node_element, name, value)); 
} 

Sugestia używania allocate_string() jak na pracy ręcznej, ale to tak łatwo zapomnieć.

Czy ktoś "ulepszony" RapidXML, aby uniknąć tego problemu?

+0

Nie "poprawiam" rapidxml wbrew temu duchowi? Jest to super szybki parser, a brak własności jest kluczową częścią tego. –

+0

OK, może "opakowanie" jest lepszym terminem. Ale nie ma nic złego w tym, że mamy * dodatkowy * "bezpieczniejszy" interfejs ... Użytkownicy będą musieli wybrać szybkość a kruchość. – Roddy

+0

W tym przypadku nie są to "statystyka" i "wartość" statyczne na stercie, a więc mają zakres w całym programie. – Mark

Odpowiedz

1

Nie używam RapidXML, ale może moje podejście może rozwiązać Twój problem.

Zacząłem używać Xerces, ale stwierdziłem, że jest ciężki, poza innymi drobnymi przykrościami, więc przeniosłem się na CPPDOM. Kiedy wykonałem ten ruch, postanowiłem utworzyć zestaw klas wrapperów, aby mój kod nie był zależny od konkretnego silnika XML i w razie potrzeby mógłbym przesłać go do innego.

Stworzyłem własne klasy do reprezentowania podstawowych elementów DOM (węzeł, dokument itp.). Te klasy używają wewnętrznie idiomu pimpl do używania obiektów CPPDOM. Ponieważ mój obiekt węzła zawiera "rzeczywisty" obiekt węzła (z CPPDOM), mogę zarządzać dowolnymi potrzebami, więc właściwa alokacja i deallokacja ciągów nie będzie tam problemem.

Ponieważ mój kod jest dla CPPDOM, nie sądzę, że byłoby to dla ciebie przydatne, ale mogę go opublikować, jeśli chcesz.

BTW, jeśli masz już za dużo kodu, który już używa RapidXML, możesz odtworzyć jego interfejsy w swoich klasach otoki. Nie zrobiłem tego, ponieważ kod, który używał Xercesa, nie był tak długi i musiałbym go przerobić.

+0

Może nie odpowiedź, której szukałem, ale najlepsze, co dostanę. Dzięki! – Roddy

Powiązane problemy