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!" );
10- }
11-
12- mName = root.tagName ();
13- mText = root.text ();
8+ Q_ASSERT (reader.isStartElement ());
149
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 ());
10+ mName = reader. name (). toString ();
11+ for (const QXmlStreamAttribute& attr : reader. attributes () ) {
12+ mAttributes .insert (attr. name (). toString (), attr. value (). toString ());
1813 }
1914
20- for (QDomElement c = root.firstChildElement (); !c.isNull (); c = c.nextSiblingElement ()) {
21- mChilds .append (DomElement (c));
15+ while (!reader.atEnd ()) {
16+ reader.readNext ();
17+ if (reader.isCharacters ()) {
18+ mText .append (reader.text ().toString ());
19+ } else if (reader.isStartElement ()) {
20+ mChilds .append (DomElement (reader));
21+ } else if (reader.isEndElement ()) {
22+ break ;
23+ }
2224 }
2325}
2426
2527DomElement::~DomElement () noexcept
2628{
2729}
2830
31+ DomElement DomElement::parse (QXmlStreamReader& reader)
32+ {
33+ std::optional<DomElement> root;
34+ while (!reader.atEnd ()) {
35+ reader.readNext ();
36+ if (reader.isStartElement ()) {
37+ root = DomElement (reader);
38+ }
39+ }
40+ if ((!root) || reader.hasError ()) {
41+ const QString err = " Failed to parse XML: " + reader.errorString ();
42+ throw std::runtime_error (err.toStdString ());
43+ }
44+ return *root;
45+ }
46+
47+ DomElement DomElement::parse (const QString& data)
48+ {
49+ QXmlStreamReader reader;
50+ reader.addData (data);
51+ return parse (reader);
52+ }
53+
54+ DomElement DomElement::parse (const QByteArray& data)
55+ {
56+ QXmlStreamReader reader;
57+ reader.addData (data);
58+ return parse (reader);
59+ }
60+
2961QString DomElement::getAttributeAsString (const QString& name) const
3062{
3163 if (mAttributes .contains (name)) {
@@ -37,7 +69,8 @@ QString DomElement::getAttributeAsString(const QString& name) const
3769 }
3870}
3971
40- bool DomElement::getAttributeAsBool (const QString& name) const {
72+ bool DomElement::getAttributeAsBool (const QString& name) const
73+ {
4174 const QString value = getAttributeAsString (name);
4275 if (value == " yes" ) {
4376 return true ;
0 commit comments