C ++ sax2 парсер проблема - PullRequest
1 голос
/ 25 марта 2011

Я хочу проанализировать файл XML.Мой XML выглядит так:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
  <name>tracker</name>
  <value>localhost:58303</value>
  <description>The host and port that the MapReduce job tracker runs
  at.  If "local", then jobs are run in-process as a single map
  and reduce task.
  </description>
</property>

</configuration>

Я использую синтаксический анализатор sxx 2 для анализа этого файла.Я хочу связать значение element<value> от localhost до 192.168.0.5.Я написал код на C ++, который выглядит следующим образом:

#include <SAX2XMLReader.hpp>
#include <XMLReaderFactory.hpp>
#include <DefaultHandler.hpp>
#include <XMLString.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";
        cout << "Exception message is: \n"
             << message << "\n";
        XMLString::release(&message);
        return 1;
    }

    char* xmlFile = "/home/project/conf/mapred.xml";
    SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
    parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
    parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);   // optional

    DefaultHandler* defaultHandler = new DefaultHandler();
    parser->setContentHandler(defaultHandler);
    parser->setErrorHandler(defaultHandler);

    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 SAXParseException& toCatch) {
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "Exception message is: \n"
             << message << "\n";
        XMLString::release(&message);
        return -1;
    }
    catch (...) {
        cout << "Unexpected Exception \n" ;
        return -1;
    }

    delete parser;
    delete defaultHandler;
    return 0;
}

Код компилируется.Что я хочу знать, как я могу изменить значение в файле XML?Как мне написать обработчик для этого и использовать его в моем коде?Кто-нибудь может объяснить, что мне нужно сделать, чтобы успешно изменить значение в файле XML?

1 Ответ

0 голосов
/ 25 марта 2011

Вы не можете изменить значение с помощью обработчика SAX AFAIK.Обычно я определяю как обработчик саксофона для преобразования из xml в некоторый объект c ++, так и конструктор документов для преобразования из объекта в xml.

Общий подход заключается в следующем: используйте обработчик sax с анализатором xml для получения объекта, измените объект, а затем используйте конструктор документов для сохранения файла xml.Посмотрите на класс DomWriter.Был также пример, который показывает вам, как создать XML-документ с помощью xerces.

Может быть, вы также можете просто найти тег, который хотите связать со значением, и заменить строку, если хотите избежатьвесь процесс преобразования XML (зависит от структуры вашего документа и т. д.).

Редактировать: XML имеет два аспекта: анализ и построение.Когда дело доходит до разбора, у вас есть два варианта: использование sax или dom.Sax-анализ включает в себя написание обработчика.Документ XML сканируется, и обработчик вызывается как элемент в документе XML.

EG "Открывающий тег Foo Foo"

А потом "Закрывающий тег Foo"

Когда вызывается ваш обработчик, вы получаете возможность действовать.Обычно у вас есть какой-то объект в качестве члена вашего обработчика, и вы вызываете сеттеры со значением, полученным из документа xml.После того, как анализ завершен, вы можете, например, вызвать метод получения в обработчике, чтобы получить объект, который теперь имеет заданные значения.Используя sax, вы не можете изменить документ с помощью обработчика sax.

Обработчик DOM работает со всем документом xml в памяти.Я не использовал xerces DOM parser раньше, но я уверен, что для этого должен быть пример.Поскольку DOM хранит весь документ в памяти, вы можете даже изменить документ на лету, не проходя синтаксический анализ и перестройку, как я описал выше.Я бы определенно исследовал примеры синтаксического анализатора DOM перед использованием SAX.

...