Skip to content

Commit

Permalink
Base::Reader: support reading child element with the same name as parent
Browse files Browse the repository at this point in the history
Future GuiDocument.xml will save recursive tree item expansion status
using child element with the same name as the parent.
  • Loading branch information
realthunder committed Jul 16, 2019
1 parent e980422 commit b2a823b
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 5 deletions.
17 changes: 14 additions & 3 deletions src/Base/Reader.cpp
Expand Up @@ -252,10 +252,18 @@ void Base::XMLReader::readElement(const char* ElementName)
(ElementName && LocalName != ElementName));
}

void Base::XMLReader::readEndElement(const char* ElementName)
int Base::XMLReader::level() const {
return Level;
}

void Base::XMLReader::readEndElement(const char* ElementName, int level)
{
// if we are already at the end of the current element
if (ReadType == EndElement && LocalName == ElementName) {
if (ReadType == EndElement
&& ElementName
&& LocalName == ElementName
&& (level<0 || level==Level))
{
return;
}
else if (ReadType == EndDocument) {
Expand All @@ -268,7 +276,10 @@ void Base::XMLReader::readEndElement(const char* ElementName)
ok = read(); if (!ok) break;
if (ReadType == EndDocument)
break;
} while (ReadType != EndElement || (ElementName && LocalName != ElementName));
} while (ReadType != EndElement
|| (ElementName
&& (LocalName != ElementName
|| (level>=0 && level!=Level))));
}

void Base::XMLReader::readCharacters(void)
Expand Down
20 changes: 18 additions & 2 deletions src/Base/Reader.h
Expand Up @@ -134,10 +134,26 @@ class BaseExport XMLReader : public XERCES_CPP_NAMESPACE_QUALIFIER DefaultHandle
//@{
/// get the local name of the current Element
const char* localName(void) const;
/// get the current element level
int level() const;
/// read until a start element is found (\<name\>) or start-end element (\<name/\>) (with special name if given)
void readElement (const char* ElementName=0);
/// read until an end element is found (with special name if given)
void readEndElement(const char* ElementName=0);

/** read until an end element is found
*
* @param ElementName: optional end element name to look for. If given, then
* the parser will read until this name is found.
*
* @param level: optional level to look for. If given, then the parser will
* read until this level. Note that the parse only increase the level when
* finding a start element, not start-end element, and decrease the level
* after finding an end element. So, if you obtain the parser level after
* calling readElement(), you should specify a level minus one when calling
* this function. This \c level parameter is only useful if you know the
* child element may have the same name as its parent, otherwise, using \c
* ElementName is enough.
*/
void readEndElement(const char* ElementName=0, int level=-1);
/// read until characters are found
void readCharacters(void);
/// read binary file
Expand Down

0 comments on commit b2a823b

Please sign in to comment.