Files
2025-12-15 23:22:33 +08:00

86 lines
1.8 KiB
C++

#include "HXmlReport.h"
#include <fstream>
HXmlReport::HXmlReport()
{
HXmlElement* psXmlElement = new HXmlElement("ModelFile");
m_apPath.push_back(psXmlElement);
m_sDocument.LinkEndChild(psXmlElement);
}
HXmlReport::~HXmlReport()
{
}
void HXmlReport::SaveFile(const char* pcReportPath, const char* pcXslFile)
{
m_sDocument.SetCondenseWhiteSpace(false);
if (pcXslFile)
{
// stylesheet metadata are not supported by tinyXML
// => we have to add xsl link manually at the beginning of the xml file
// Instead of directly write into file, plug a printer to XML document, to "write" xml in a std::string
TiXmlPrinter printer;
printer.SetIndent("\t");
m_sDocument.Accept(&printer);
// Write xst information + printer string into file
std::ofstream ofs;
ofs.open(pcReportPath, std::ofstream::out);
ofs << "<?xml version=\"1.0\"?>" << std::endl;
ofs << "<?xml-stylesheet href=\"" << pcXslFile << "\" type=\"text/xsl\"?>" << std::endl;
ofs << printer.CStr();
ofs.close();
}
else
{
if (m_sDocument.SaveFile(pcReportPath))
fprintf(stdout, "XML file saved as %s\n", pcReportPath);
else
fprintf(stdout, "Cannot create XML file %s\n", pcReportPath);
fflush(stdout);
}
}
void HXmlReport::closeSubNode()
{
if (m_apPath.empty())
{
//can remove root note
return;
}
m_apPath.pop_back();
}
void HXmlReport::addNode(HXmlElement* psNewNode)
{
if(psNewNode == NULL)
return;
if (m_apPath.empty())
{
//no tree create
return;
}
m_apPath.back()->LinkEndChild(psNewNode);
}
void HXmlReport::createSubNode(const char* pcNameNode)
{
HXmlElement*psNewNode = new HXmlElement(pcNameNode);
if (psNewNode == NULL)
return;
if (m_apPath.empty())
{
//no tree create
return;
}
m_apPath.back()->LinkEndChild(psNewNode);
m_apPath.push_back(psNewNode);
}