1

我想解析一个 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 文件中的值?

4

1 回答 1

0

您不能使用 SAX 处理程序 AFAIK 更改该值。一般来说,我定义了一个 sax 处理程序来从 xml 转换为一些 c++ 对象,以及一个文档构建器来从对象转换为 xml。

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

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

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

EG“看到 Foo 开始标签”

然后是“看到 Foo 结束标签”

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

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

于 2011-03-25T04:54:07.183 回答