Core: add method to XMLReader to access next element of an XML file

If the next element could be read-in successfully true is returned, and false otherwise.
This commit is contained in:
wmayer
2023-10-08 19:17:53 +02:00
committed by wwmayer
parent 56820718c5
commit ce3e6b9b24
3 changed files with 44 additions and 9 deletions

View File

@@ -222,10 +222,38 @@ void Base::XMLReader::readElement(const char* ElementName)
(ElementName && LocalName != ElementName));
}
bool Base::XMLReader::readNextElement()
{
bool ok{};
while (true) {
ok = read();
if (!ok)
break;
if (ReadType == StartEndElement)
break;
if (ReadType == EndElement)
break;
if (ReadType == EndDocument)
break;
};
return (ReadType == StartEndElement);
}
int Base::XMLReader::level() const {
return Level;
}
bool Base::XMLReader::isEndOfElement() const
{
return (ReadType == EndElement);
}
bool Base::XMLReader::isEndOfDocument() const
{
return (ReadType == EndDocument);
}
void Base::XMLReader::readEndElement(const char* ElementName, int level)
{
// if we are already at the end of the current element

View File

@@ -146,9 +146,19 @@ public:
const char* localName() const;
/// get the current element level
int level() const;
/// return true if the end of an element is reached, false otherwise
bool isEndOfElement() const;
/// return true if the end of the document is reached, false otherwise
bool isEndOfDocument() const;
/// read until a start element is found (\<name\>) or start-end element (\<name/\>) (with special name if given)
void readElement (const char* ElementName=nullptr);
/// Read in the next element. Return true if it succeeded and false otherwise
bool readNextElement();
/** read until an end element is found
*
* @param ElementName: optional end element name to look for. If given, then

View File

@@ -1486,15 +1486,12 @@ void Document::RestoreDocFile(Base::Reader &reader)
}
}
//TODO: Implement a method to start the next element and returns its name
try {
localreader->readElement("ProjectUnitSystem");
d->projectUnitSystem = localreader->getAttributeAsInteger("US");
d->projectUnitSystemIgnore = localreader->getAttributeAsInteger("ignore");
localreader->readEndElement("Document");
}
catch (const Base::XMLParseException) {
// fails for older project files
if (localreader->readNextElement()) {
if (strcmp(localreader->localName(), "ProjectUnitSystem") == 0) {
d->projectUnitSystem = localreader->getAttributeAsInteger("US");
d->projectUnitSystemIgnore = localreader->getAttributeAsInteger("ignore");
localreader->readEndElement("Document");
}
}
}