我想解析一个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文件中的值吗?
答案 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解析器示例。