33
44namespace parseagle {
55
6- DomElement::DomElement (const QDomElement& root )
6+ DomElement::DomElement (QXmlStreamReader& reader )
77{
8- if (root.isNull ()) {
9- throw std::runtime_error (" Invalid XML node!" );
8+ mName = reader.name ().toString ();
9+ for (const QXmlStreamAttribute& attr : reader.attributes ()) {
10+ mAttributes .insert (attr.name ().toString (), attr.value ().toString ());
1011 }
1112
12- mName = root.tagName ();
13- mText = root.text ();
14-
15- QDomNamedNodeMap map = root.attributes ();
16- for (int i = 0 ; i < map.count (); i++) {
17- mAttributes .insert (map.item (i).nodeName (), map.item (i).nodeValue ());
13+ while (!reader.atEnd ()) {
14+ reader.readNext ();
15+ if (reader.isCharacters ()) {
16+ mText .append (reader.text ().toString ());
17+ } else if (reader.isStartElement ()) {
18+ mChilds .append (DomElement (reader));
19+ } else if (reader.isEndElement ()) {
20+ break ;
21+ }
1822 }
1923
20- for (QDomElement c = root.firstChildElement (); !c.isNull (); c = c.nextSiblingElement ()) {
21- mChilds .append (DomElement (c));
24+ if (reader.hasError ()) {
25+ const QString err = " Failed to parse XML: " + reader.errorString ();
26+ throw std::runtime_error (err.toStdString ());
2227 }
2328}
2429
2530DomElement::~DomElement () noexcept
2631{
2732}
2833
34+ DomElement DomElement::parse (QXmlStreamReader& reader)
35+ {
36+ while (!reader.atEnd ()) {
37+ reader.readNext ();
38+ if (reader.isStartElement ()) {
39+ break ;
40+ }
41+ }
42+ if (reader.hasError () || (!reader.isStartElement ())) {
43+ const QString err = " Failed to find XML root element: " + reader.errorString ();
44+ throw std::runtime_error (err.toStdString ());
45+ }
46+ const DomElement root (reader);
47+ if (reader.hasError () || (!reader.isEndElement ())) {
48+ const QString err = " XML file seems incomplete: " + reader.errorString ();
49+ throw std::runtime_error (err.toStdString ());
50+ }
51+ return root;
52+ }
53+
54+ DomElement DomElement::parse (const QString& data)
55+ {
56+ QXmlStreamReader reader;
57+ reader.addData (data);
58+ return parse (reader);
59+ }
60+
61+ DomElement DomElement::parse (const QByteArray& data)
62+ {
63+ QXmlStreamReader reader;
64+ reader.addData (data);
65+ return parse (reader);
66+ }
67+
2968QString DomElement::getAttributeAsString (const QString& name) const
3069{
3170 if (mAttributes .contains (name)) {
@@ -37,7 +76,8 @@ QString DomElement::getAttributeAsString(const QString& name) const
3776 }
3877}
3978
40- bool DomElement::getAttributeAsBool (const QString& name) const {
79+ bool DomElement::getAttributeAsBool (const QString& name) const
80+ {
4181 const QString value = getAttributeAsString (name);
4282 if (value == " yes" ) {
4383 return true ;
0 commit comments