39#define G_VALUE "GXmlElement::value()"
40#define G_ATTRIBUTE "GXmlElement::attribute(int&)"
41#define G_PARSE_START "GXmlElement::parse_start(std::string&)"
42#define G_PARSE_STOP "GXmlElement::parse_stop(std::string&)"
43#define G_PARSE_ATTRIBUTE "GXmlElement::parse_attribute(size_t*, "\
180 const std::string& value) :
GXmlNode()
299 std::string msg =
"Method requires a XML element instance that "
300 "contains a single child, but this instance "
302 "Please specify a valid XML element.";
309 std::string msg =
"XML element instance does not contain a text "
310 "element. Please specify a valid XML element.";
315 return (text->
text());
331 #if defined(G_RANGE_CHECK)
339 return (&(
m_attr[index]));
355 std::string
value =
"";
358 for (
int i = 0; i <
m_attr.size(); ++i) {
389 for (
int i = 0; i <
m_attr.size(); ++i) {
423 for (
int i = 0; i <
m_attr.size(); ++i) {
455 for (
int i = 0; i < num; ++i) {
480 for (
int k = 0; k < indent; ++k) {
488 for (
int k = 0; k <
m_attr.size(); ++k) {
520 for (
int i = 0; i <
m_nodes.size(); ++i) {
528 for (
int k = 0; k < indent; ++k) {
550 const int& indent)
const
562 result.append(
"GXmlElement::"+
m_name);
563 for (
int k = 0; k <
m_attr.size(); ++k) {
568 for (
int i = 0; i <
m_nodes.size(); ++i) {
642 std::size_t pos_start = 0;
645 int n = segment.length();
649 std::string msg =
"Empty XML segment encountered. Please verify the "
656 if (segment[0] ==
'<') {
657 if (n < 2 || (segment.compare(0,1,
"<") != 0) ||
658 (segment.compare(n-1,1,
">") != 0)) {
659 std::string msg =
"Invalid tag brackets encountered in XML "
660 "segment \""+segment+
"\". Please verify the "
668 std::size_t pos = segment.find_first_of(
"\x20\x09\x0d\x0a>", 1);
669 if (pos == pos_start) {
670 std::string msg =
"Whitespace before element name encountered in XML "
671 "segment \""+segment+
"\". Please verify the "
675 if (pos == std::string::npos) {
676 if (pos_start == 1) {
677 std::string msg =
"No element name found in XML segment \""+
678 segment+
"\". Please verify the XML format.";
682 m_name = segment.substr(pos_start, pos-pos_start);
685 while (pos != std::string::npos) {
707 int n = segment.length();
710 if (n < 3 || (segment.compare(0,2,
"</") != 0) ||
711 (segment.compare(n-1,1,
">") != 0)) {
712 std::string msg =
"Incorrect or missing tag brackets encountered in "
713 "XML segment \""+segment+
"\". Please verify the "
719 size_t pos = segment.find_first_of(
"\x20\x09\x0d\x0a>", 2);
721 std::string msg =
"Whitespace encountered after \"</\" in XML "
722 "segment \""+segment+
"\". Please verify the XML "
726 if (pos == std::string::npos) {
727 std::string msg =
"No element name found in XML segment \""+
728 segment+
"\". Please verify the XML format.";
731 std::string
name = segment.substr(2, pos-2);
733 std::string msg =
"Element name \""+
name+
"\" found in stop tag in XML "
734 "segment \""+segment+
"\" while start tag has name "
735 "\""+
m_name+
"\". Please verify the XML format.";
740 size_t pos2 = segment.find_first_of(
"\x20\x09\x0d\x0a>", pos);
742 std::string msg =
"Invalid characters encountered after element name "
743 "in XML segment \""+segment+
"\". Please verify the "
772 std::string error = segment.substr(*pos, segment.length()-*pos);
775 std::size_t pos_name_start = segment.find_first_not_of(
"\x20\x09\x0d\x0a/>?", *pos);
776 if (pos_name_start == std::string::npos) {
777 *pos = std::string::npos;
782 std::size_t pos_name_end = segment.find_first_of(
"\x20\x09\x0d\x0a=", pos_name_start);
783 if (pos_name_end == std::string::npos) {
784 std::string msg =
"Invalid or missing attribute name encountered "
785 "in XML segment \""+error+
"\". Please verify "
791 std::size_t pos_equal = segment.find_first_of(
"=", pos_name_end);
792 if (pos_equal == std::string::npos) {
793 std::string msg =
"Missing \"=\" sign for attribute encountered "
794 "in XML segment \""+error+
"\". Please verify "
800 std::size_t pos_value_start = segment.find_first_of(
"\x22\x27", pos_equal);
801 if (pos_value_start == std::string::npos) {
802 std::string msg =
"Invalid or missing attribute value start "
803 "hyphen encountered in XML segment \""+
804 error+
"\". Please verify the XML format.";
809 std::string hyphen = segment.substr(pos_value_start, 1);
811 if (pos_value_start >= segment.length()) {
812 std::string msg =
"Invalid or missing attribute value encountered "
813 "in XML segment \""+error+
"\". Please verify "
819 std::size_t pos_value_end = segment.find_first_of(hyphen, pos_value_start);
820 if (pos_value_end == std::string::npos) {
821 std::string msg =
"Invalid or missing attribute value end hyphen "
822 "encountered in XML segment \""+error+
823 "\". Please verify the XML format.";
828 std::size_t n_name = pos_name_end - pos_name_start;
830 std::string msg =
"Invalid or missing attribute name encountered "
831 "in XML segment \""+error+
"\". Please verify "
835 std::string
name = segment.substr(pos_name_start, n_name);
840 std::size_t n_value = pos_value_end - pos_value_start;
841 std::string
value = segment.substr(pos_value_start-1, n_value+2);
851 if (pos_value_end >= segment.length()) {
852 pos_value_end = std::string::npos;
854 *pos = pos_value_end;
Exception handler interface definition.
Filename class interface definition.
XML document node class interface definition.
const int g_indent
Indent for XML file writing.
#define G_PARSE_ATTRIBUTE
XML element node class interface definition.
XML text node class interface definition.
virtual void printf(const char *format,...)=0
void parse_stop(const std::string &segment)
Parse element stop segment string.
std::string m_name
Element name.
virtual void clear(void)
Clear XML element.
std::vector< GXmlAttribute > m_attr
Attributes.
void parse_start(const std::string &segment)
Parse element start segment string.
const GXmlAttribute * attribute(const int &index) const
Return attribute.
virtual ~GXmlElement(void)
Destructor.
void free_members(void)
Delete class members.
virtual void write(GUrl &url, const int &indent=0) const
Write element into URL.
GXmlElement(void)
Void constructor.
GXmlElement & operator=(const GXmlElement &node)
Assignment operator.
void copy_members(const GXmlElement &node)
Copy class members.
bool has_attribute(const std::string &name) const
Check if element has a given attribute.
void parse_attribute(size_t *pos, const std::string &segment)
Parse element attribute.
std::string value(void) const
Return string value.
void remove_attribute(const std::string &name)
Remove attribute from element.
virtual GXmlElement * clone(void) const
Clone XML element.
const std::string & name(void) const
Return XML element name.
virtual NodeType type(void) const
Return XML node type.
int attributes(void) const
Return number of attributes.
virtual std::string print(const GChatter &chatter=NORMAL, const int &indent=0) const
Print XML element.
void init_members(void)
Initialise class members.
Abstract XML node base class.
virtual GXmlNode * append(const GXmlNode &node)
Append XML child node.
GXmlNode & operator=(const GXmlNode &node)
Assignment operator.
std::vector< GXmlNode * > m_nodes
Pointer to child nodes.
void free_members(void)
Delete class members.
virtual bool is_empty(void) const
Signals if node has no child nodes.
virtual int size(void) const
Return number of child nodes.
void init_members(void)
Initialise class members.
const std::string & text(void) const
Return text.
std::string str(const unsigned short int &value)
Convert unsigned short integer value into string.
std::string fill(const std::string &s, const int &n)
Fill string with n strings of same type.