C ++ sax2解析器问题

时间:2011-03-25 04:18:23

标签: c++ xml parsing sax xerces-c

我想解析一个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 :(得分:0)

您无法使用SAX处理程序AFAIK更改该值。通常我定义了一个sax处理程序,用于从xml转换为某个c ++对象,以及一个文档构建器,用于将对象转换为xml。

一般方法如下:使用带有xml解析器的sax处理程序来获取对象,修改对象,然后使用文档构建器来保存xml文件。看看DomWriter课程。还有一个示例向您展示了如何使用xerces构建XML文档。

也许您也可以只搜索要链接到值的标记,如果要避免整个XML转换过程(取决于文档结构等),请执行字符串替换。

编辑: XML有两个方面:解析和构建。解析时,您有两个选择:使用sax或dom。 Sax解析涉及到编写处理程序。扫描XML文档,并在遇到XML文档中的元素时调用处理程序。

E.G。 “看到Foo开场标签”

然后 “看到Foo关闭标签”

当您的处理程序被调用时,您将有机会采取行动。通常,您将某个对象作为处理程序的成员,并且您将使用从xml文档获取的值调用setter。一旦解析完成,您就可以例如在处理程序上调用getter来检索现在具有设置值的对象。使用sax,不能使用sax处理程序修改文档。

DOM处理程序使用内存中的整个xml文档。我之前没有使用过xerces DOM解析器,但我确信必须有一个例子。由于DOM在内存中包含整个文档,因此您甚至可以在不经过上面概述的sax解析和重建的情况下即时更改文档。在使用SAX之前,我肯定会研究DOM解析器示例。