64 #include "rnr/tinyxml/tinyxml.h" 66 #include "rnr/rnrconfig.h" 79 Xml::Xml(
const string &strRootElem,
80 const string &strXsiUrl,
81 const string &strXslUrl) :
82 m_strRootElemName(strRootElem),
83 m_strXsiUrl(strXsiUrl),
84 m_strXslUrl(strXslUrl)
97 if( strXmlFileName.empty() )
121 setErrorMsg(
"Not a valid %s XML document: No root <%s> element found.",
129 setErrorMsg(
"Not a valid %s XML document: Root <%s> element not <%s>.",
145 if( strXmlFileName.empty() )
172 const string &strMajorElemName)
176 if( strXmlFileName.empty() )
199 fprintf(fp,
"<%s>\n</%s>\n",
200 strMajorElemName.c_str(), strMajorElemName.c_str());
214 if( strXmlFileName.empty() )
222 bAccess = access(strXmlFileName.c_str(), F_OK|R_OK|W_OK) == 0;
225 if( !bAccess && bRequired )
228 strXmlFileName.c_str(), strerror(errno), errno);
240 if( strMajorElemName.empty() )
253 pElem = pElem->NextSiblingElement())
255 sValue = pElem->Value();
261 else if( !strcasecmp(sValue, strMajorElemName.c_str()) )
275 if( (pElem != NULL) && ((s = pElem->GetText()) != NULL) )
288 if( (pElem != NULL) &&
289 !strAttrName.empty() &&
290 ((s = pElem->Attribute(strAttrName.c_str())) != NULL) )
302 if( sscanf(str.c_str(),
"%lli", &val1) != 1 )
304 LOGERROR(
"%s: Bad integer string representation.", str.c_str());
320 snprintf(buf,
sizeof(buf),
"0x%x", val);
323 snprintf(buf,
sizeof(buf),
"%d", val);
326 snprintf(buf,
sizeof(buf),
"0%o", val);
329 LOGERROR(
"%d: Unsupported base conversion.", base);
333 buf[
sizeof(buf)-1] = 0;
342 if( sscanf(str.c_str(),
"%lf", &val) != 1 )
344 LOGERROR(
"%s: Bad floating-point number string representation.",
357 snprintf(buf,
sizeof(buf),
"%lf", val);
359 buf[
sizeof(buf)-1] = 0;
368 stringstream ssStylesheetStmt;
369 stringstream ssRootStmt;
375 ssStylesheetStmt <<
"";
381 ssStylesheetStmt <<
"<?xml-stylestheet type=\"text/xsl\" href=\"" 396 <<
" xsi:noNamespaceSchemaLocation=\"" <<
m_strXsiUrl <<
"\">";
400 << ssStylesheetStmt.str() <<
"\n" 401 << ssRootStmt.str() <<
">\n\n";
const char *const XmlNsXsi
virtual int loadFile(const std::string &strXmlFileName)
Load XML file into DOM.
virtual void makeXmlHead()
Make XML document head string.
int intToStr(const int val, std::string &str, int base=10)
Convert integer to string.
std::string m_strXmlTail
xml document tail
std::string m_strXsiUrl
xml schema instance
virtual int saveFile(const std::string &strXmlFileName)
Save DOM to XML file.
char m_bufErrMsg[256]
error message buffer
TiXmlDocument m_xmlDoc
parsed xml DOM
std::string m_strXmlFileName
xml file path name
std::string elemText(TiXmlElement *pElem)
Get element's text.
virtual int createTemplateFile(const std::string &strXmlFileName, const std::string &strMajorElemName)
Create XML file with the given major element name under the root element.
std::string m_strRootElemName
xml top-level root element name
std::string elemAttr(TiXmlElement *pElem, const std::string &strAttrName)
Get element's attribute value.
int strToDouble(const std::string &str, double &val)
Convert string to double-precision floating-point number.
std::string m_strXslUrl
xml style sheet
void setErrorMsg(const char *sFmt,...)
Set XML error message.
virtual ~Xml()
Destructor.
bool fileExists(const std::string &strXmlFileName, bool bRequired=false)
Check that the XML file exists and has read/write access.
virtual void makeXmlTail()
Make XML document tail string.
bool m_bModified
xml [not] modified
void setModifiedState(bool bModified)
Set DOM modified state.
std::string m_strXmlHead
xml document head
TiXmlElement * m_pElemRoot
top-level root element
int doubleToStr(const double val, std::string &str)
Convert double to string.
TiXmlElement * getMajorElem(const std::string &strMajorElemName)
Get the major element in the DOM.
int strToInt(const std::string &str, int &val)
Convert string to integer.
const char *const XmlDecl