【问题标题】:C++ sax2 parser problemC++ sax2解析器问题
【发布时间】:2011-03-25 04:18:23
【问题描述】:

我想解析一个 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&lt;value&gt; 的值从 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 文件中的值?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    例如 “看到了 Foo 开始标签”

    然后稍后 “看到了 Foo 结束标签”

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

    DOM 处理程序处理内存中的整个 xml 文档。我以前没有使用过 xerces DOM 解析器,但我确信一定有一个例子。由于 DOM 将整个文档保存在内存中,您甚至可以即时更改文档,而无需通过我上面概述的 sax 解析和重建。在使用 SAX 之前,我肯定会研究 DOM 解析器示例。

    【讨论】:

    • thanx 回答但我不知道如何使用处理程序和文档生成器我查看 dom approch 但我想用 sax 2 来做。
    • thanx 回答但我不知道如何使用处理程序和文档生成器我看 dom 方法但我想用 sax 2 来做。我不知道什么样的对象处理程序返回?如何使用它们?你可以举出任何例子,因为我看到了 sax2 的文档,但不清楚
    • 在我的回答中添加了一些解释。最好的例子是解决方案中的例子。其中一个专门展示了 SAX 的使用。如果你想了解处理程序是如何被调用的,我建议在 HandlerBase::startElement、characters 和 endElement 方法中放置断点。
    • 感谢 Ralf 的响应。ralf 我很新手。你能告诉我什么时候调用我的处理程序吗?如何放置断点?你能用一个合适的例子来解释吗,因为我发现的所有例子都不清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多