i'm new to c++ and xerces. i'm triying to make change in an xml file using xerces dom parser. my xml file which i want to change is following : its name is sel.xml
Expand|Select|Wrap|Line Numbers
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!-- Put site-specific property overrides in this file. -->
- <configuration>
- <property>
- <name>fs.default.name</name>
- <value> name</value>
- </property>
- </configuration>
- i want to change <value>name</value> to <value>next</next>
- my cpp file code is following:
- #include<string.h>
- #include<iostream>
- #include<sstream>
- #include<sys/types.h>
- #include<unistd.h>
- #include<errno.h>
- #include<sys/stat.h>
- #include "parser1.hpp"
- #include <typeinfo>
- using namespace xercesc ;
- using namespace std;
- GetConfig::GetConfig()
- {
- XMLPlatformUtils::Initialize();
- TAG_configuration =XMLString::transcode("configuration");
- TAG_property = XMLString::transcode("property");
- TAG_name=XMLString::transcode("name");
- TAG_value=XMLString::transcode("value");
- m_ConfigFileParser=new XercesDOMParser;
- }
- GetConfig::~GetConfig()
- {
- delete m_ConfigFileParser;
- XMLString::release( &TAG_configuration );
- XMLString::release( &TAG_property );
- //XMLString::release( &TAG_value );
- //XMLString::release( &TAG_name );
- XMLPlatformUtils::Terminate();
- }
- void GetConfig :: readConfigFile(string& configFile)
- throw( std::runtime_error )
- {
- /*struct stat fileStatus;
- int iretStat = stat(configFile.c_str(), &fileStatus);
- if( iretStat == ENOENT )
- throw ( std::runtime_error("Path file_name does not exist, or path is an empty string.") );
- else if( iretStat == ENOTDIR )
- throw ( std::runtime_error("A component of the path is not a directory."));
- else if( iretStat == ELOOP )
- throw ( std::runtime_error("Too many symbolic links encountered while traversing the path."));
- else if( iretStat == EACCES )
- throw ( std::runtime_error("Permission denied."));
- else if( iretStat == ENAMETOOLONG )
- throw ( std::runtime_error("File can not be read\n"));
- */
- // Configure DOM parser.
- m_ConfigFileParser->setValidationScheme( XercesDOMParser::Val_Never );
- m_ConfigFileParser->setDoNamespaces( false );
- m_ConfigFileParser->setDoSchema( false );
- m_ConfigFileParser->setLoadExternalDTD( false );
- m_ConfigFileParser->parse( configFile.c_str() );
- DOMDocument* doc = m_ConfigFileParser->getDocument();
- DOMElement *root = doc->getDocumentElement();
- const XMLCh* tag = xercesc::XMLString::transcode("property");
- const XMLCh* tag1 = xercesc::XMLString::transcode("value");
- const XMLCh* tag2 = xercesc::XMLString::transcode("name");
- //DOMNodeList * list= doc->getElementbyTagName("tag");
- //cout<<moot;
- //DOMNode * rootElem = doc->getDocumentElement();
- cout << "\nfirst";
- //DOMNode *root = doc->getFirstChild() ;
- cout << "\nsecond\n";
- cout<< root<<"\n" ;
- if ( root )
- {
- cout<<"hi\n";
- DOMElement* property = dynamic_cast<DOMElement*>( root->getElementsByTagName( tag )->item( 0) );
- if ( property )
- {
- cout<<"hello";
- DOMElement* name = dynamic_cast<DOMElement*>( property->getElementsByTagName( tag2 )->item( 0 ) );
- if ( name )
- {
- cout<<"\nmanish\n";
- DOMElement* value = dynamic_cast<DOMElement*>( property->getElementsByTagName( tag1 )->item( 0 ) );
- if ( value )
- {
- cout<<XMLString::transcode(value->getTextContent());
- cout<<"\n";
- value->setTextContent( XMLString::transcode(" next") ); // this will update the element named "value"
- }
- }
- }
- }
- int main()
- {
- string configFile="/home/manish.yadav/Desktop/sel.xml";
- GetConfig appConfig;
- appConfig.readConfigFile(configFile);
- return 0;
- }
first
second
0x1314e50
hi
hello
manish
name
the extra output are becoz i want to check the flow control of program
now my problem is that i used the method value->setTextContent( XMLString::transcode(" next") );
it is not working ;
in my xml file i saw the old value. the value is not changing there what should i do so that the value change in sel.xml file too?
what should i do to change the value in xml file ?
what i 'm doing wrong?
i goggled the matter lot but someone saying i cant make change in xml file .
to change xml file i have to read the content of file and create a new file .
can anybody explain what should i do?
i read the dom Programming guide, api Documentation but nothing substantial.
what is the method or way to read from old xml file and write it to a new file ?
can any body explain with code ?
how to make new xml file using dom c++ parser?