Xerces C++ - Загрузка, считайте и сохраните, альтернативы?

Я ищу учебное руководство, чтобы загрузить XML-файл, считать его, изменить его и наконец сохранить его с C++. Я использую Linux Ubuntu и судивший для использования Xerces. С Google и много времени, я мог только загрузить XML-файл:

#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>

#include <iostream>

using namespace std;
using namespace xercesc;

int main (int argc, char* args[]) {

    try {
        XMLPlatformUtils::Initialize();
    }
    catch (const XMLException& toCatch) {
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "Error during initialization! :\n"
             << message << "\n";
        XMLString::release(&message);
        return 1;
    }

    XercesDOMParser* parser = new XercesDOMParser();
    parser->setValidationScheme(XercesDOMParser::Val_Always);
    parser->setDoNamespaces(true);    // optional

    ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
    parser->setErrorHandler(errHandler);

    const char* xmlFile = "demo.xml";

    try {
        parser->parse(xmlFile);
    }
    catch (const XMLException& toCatch) {
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "Exception message is: \n"
             << message << "\n";
        XMLString::release(&message);
        return -1;
    }
    catch (const DOMException& toCatch) {
        char* message = XMLString::transcode(toCatch.msg);
        cout << "Exception message is: \n"
             << message << "\n";
        XMLString::release(&message);
        return -1;
    }
    catch (...) {
        cout << "Unexpected Exception \n" ;
        return -1;
    }

    DOMNode* docRootNode;
//  DOMNode* aNode;
    DOMDocument* doc;
    doc = parser->getDocument();
    docRootNode = doc->getDocumentElement();
    cout << docRootNode->getAttributes() << endl; //returns Hex



    delete parser;
    delete errHandler;
    return 0;
}

Как делают я могу считать управление XML-файлом и наконец сохранить его? Есть ли дополнительные библиотеки? (Я попробовал tinyxml, но ошибки возвратов файлов, когда я хочу скомпилировать его),

7
задан 24 January 2010 в 09:43
поделиться

3 ответа

LibXML++ представляется лучшим вариантом для C++. По своим возможностям она очень полная, включая XPath, преобразование кодовых страниц (по Glibmm) и все, что вы ожидаете от библиотеки XML. Она использует традиционные DOM и SAX API, что считается профи или мошенничеством, в зависимости от того, у кого вы спрашиваете. Одной из возможных проблем является то, что зависимости библиотеки чрезвычайно тяжелые (из-за использования Glibmm). Тем не менее, кажется, что это единственная приличная XML-библиотека для C++.

http://libxmlplusplus.sourceforge.net/docs/manual/html/index.html

TinyXML не разбирает XML согласно спецификации, поэтому я бы порекомендовал против этого, даже если это работает для простых документов.

1
ответ дан 7 December 2019 в 16:42
поделиться

Ребенок образца, который поставляется с Xerces, показывает, как добавлять узлы и т. Д. Для документа DOM. Код, который вы имеете до сих пор создают документ, поэтому вам нужно адаптировать код во втором образце для добавления узлов, атрибутов и т. Д.

Кроме того, обратите внимание, что, когда вы говорите:

 cout << docRootNode->getAttributes() << endl; 

Функция GetTtribute возвращает набор атрибутов - Вам необходимо применить дальнейшие функции Xerces для этой коллекции, чтобы получить содержащуюся информацию.

Обратите внимание, что если вы хотите извлечь подмножество данных в файле e XML, может быть проще использовать SAX SAX SAX (Xerces включает в себя один из них), а не создавать и ходить полный документ DOM.

0
ответ дан 7 December 2019 в 16:42
поделиться

Если вы хотите увидеть пример того, как это сделать с помощью Xerces-C ++, ознакомьтесь с этим кодом:

http://libprf1.tigris.org/files/documents/1338/13256/libprf1-0.1 R3.tar.gz

Я написал его очень давно, как университетский проект. Скорее всего, он основан на устаревшей версии Xerces-C ++, но я не думаю, что API слишком сильно изменился, чтобы стать проблемой. По крайней мере, это даст вам представление.

0
ответ дан 7 December 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: