Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
PlainXMLFormatter.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2012-2025 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
19// Static storage of an output device and its base (abstract) implementation
20/****************************************************************************/
21#include <config.h>
22
25#include "PlainXMLFormatter.h"
26
27
28// ===========================================================================
29// member method definitions
30// ===========================================================================
31PlainXMLFormatter::PlainXMLFormatter(const int defaultIndentation)
32 : OutputFormatter(OutputFormatterType::XML), myDefaultIndentation(defaultIndentation), myHavePendingOpener(false) {
33}
34
35
36bool
37PlainXMLFormatter::writeXMLHeader(std::ostream& into, const std::string& rootElement,
38 const std::map<SumoXMLAttr, std::string>& attrs,
39 bool writeMetadata, bool includeConfig) {
40 if (myXMLStack.empty()) {
42 oc.writeXMLHeader(into, includeConfig);
43 openTag(into, rootElement);
44 for (std::map<SumoXMLAttr, std::string>::const_iterator it = attrs.begin(); it != attrs.end(); ++it) {
45 writeAttr(into, it->first, it->second);
46 }
47 into << ">\n";
48 if (writeMetadata) {
49 into << " <metadata created_at=\"" << StringUtils::isoTimeString() << "\" created_by=\"" << oc.getFullName() << "\">\n";
50 oc.writeConfiguration(into, true, false, false, "", false, true, " ");
51 into << " </metadata>\n";
52 }
53 myHavePendingOpener = false;
54 return true;
55 }
56 return false;
57}
58
59
60void
61PlainXMLFormatter::openTag(std::ostream& into, const std::string& xmlElement) {
63 into << ">\n";
64 }
66 into << std::string(4 * (myXMLStack.size() + myDefaultIndentation), ' ') << "<" << xmlElement;
67 myXMLStack.push_back(xmlElement);
68}
69
70
71void
72PlainXMLFormatter::openTag(std::ostream& into, const SumoXMLTag& xmlElement) {
73 openTag(into, toString(xmlElement));
74}
75
76
77bool
78PlainXMLFormatter::closeTag(std::ostream& into, const std::string& comment) {
79 if (!myXMLStack.empty()) {
81 into << "/>" << comment << "\n";
82 myHavePendingOpener = false;
83 } else {
84 const std::string indent(4 * (myXMLStack.size() + myDefaultIndentation - 1), ' ');
85 into << indent << "</" << myXMLStack.back() << ">" << comment << "\n";
86 }
87 myXMLStack.pop_back();
88 return true;
89 }
90 return false;
91}
92
93
94void
95PlainXMLFormatter::writePreformattedTag(std::ostream& into, const std::string& val) {
97 into << ">\n";
98 myHavePendingOpener = false;
99 }
100 into << val;
101}
102
103
104void
105PlainXMLFormatter::writePadding(std::ostream& into, const std::string& val) {
106 into << val;
107}
108
109
110/****************************************************************************/
OutputFormatterType
SumoXMLTag
Numbers representing SUMO-XML - element names.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
A storage for options typed value containers)
Definition OptionsCont.h:89
void writeConfiguration(std::ostream &os, const bool filled, const bool complete, const bool addComments, const std::string &relativeTo="", const bool forceRelative=false, const bool inComment=false, const std::string &indent="") const
Writes the configuration.
void writeXMLHeader(std::ostream &os, const bool includeConfig=true) const
Writes a standard XML header, including the configuration.
const std::string & getFullName() const
get options full name
static OptionsCont & getOptions()
Retrieves the options.
Abstract base class for output formatters.
bool closeTag(std::ostream &into, const std::string &comment="")
Closes the most recently opened tag.
bool myHavePendingOpener
whether a closing ">" might be missing
PlainXMLFormatter(const int defaultIndentation=0)
Constructor.
bool writeXMLHeader(std::ostream &into, const std::string &rootElement, const std::map< SumoXMLAttr, std::string > &attrs, bool writeMetadata, bool includeConfig)
Writes an XML header with optional configuration.
int myDefaultIndentation
The initial indentation level.
static void writeAttr(std::ostream &into, const std::string &attr, const T &val)
writes an arbitrary attribute
std::vector< std::string > myXMLStack
The stack of begun xml elements.
void writePadding(std::ostream &into, const std::string &val)
writes arbitrary padding
void writePreformattedTag(std::ostream &into, const std::string &val)
writes a preformatted tag to the device but ensures that any pending tags are closed
void openTag(std::ostream &into, const std::string &xmlElement)
Opens an XML tag.
static std::string isoTimeString(const std::chrono::time_point< std::chrono::system_clock > *const timeRef=nullptr)
Returns an ISO8601 formatted time string with microsecond precision.