2 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 // + This file is part of enGrid. +
6 // + Copyright 2008-2013 enGits GmbH +
8 // + enGrid is free software: you can redistribute it and/or modify +
9 // + it under the terms of the GNU General Public License as published by +
10 // + the Free Software Foundation, either version 3 of the License, or +
11 // + (at your option) any later version. +
13 // + enGrid is distributed in the hope that it will be useful, +
14 // + but WITHOUT ANY WARRANTY; without even the implied warranty of +
15 // + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +
16 // + GNU General Public License for more details. +
18 // + You should have received a copy of the GNU General Public License +
19 // + along with enGrid. If not, see <http://www.gnu.org/licenses/>. +
21 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
23 #include "xmlhandler.h"
29 #include <QMessageBox>
36 XmlHandler::XmlHandler(QString tagName
, QObject
*parent
)
40 // initialise XML document
42 QDomElement root
= m_XmlDoc
.createElement(m_TagName
);
43 m_XmlDoc
.appendChild(root
);
46 bool XmlHandler::openXml(QString file_name
) {
47 QFile
xml_file(file_name
);
48 if (!xml_file
.open(QIODevice::ReadOnly
)) {
49 QString error_message
= "Failed to open xml_file " + xml_file
.fileName();
50 error_message
+= QString("\n") + "QDir::current()=" + QDir::current().absolutePath();
51 error_message
+= QString("\n") + "QDir::currentPath()=" + QDir::currentPath();
53 qWarning() << error_message
;
56 if (!m_XmlDoc
.setContent(&xml_file
)) {
57 qWarning() << tr("Error reading XML file:\n").arg(file_name
) << "\n setContent failed.";
62 // initialize m_DomNode
68 bool XmlHandler::saveXml(QString file_name
) {
69 QString buffer
= m_XmlDoc
.toString(2);
70 // QString buffer = m_XmlDoc.toString(0);
71 QFile
xml_file(file_name
);
72 xml_file
.open(QIODevice::WriteOnly
| QIODevice::Text
);
73 QTextStream
f(&xml_file
);
79 QString
XmlHandler::getXmlSection(QString name
) {
80 QStringList tags
= name
.toLower().split(tr("/"), QString::SkipEmptyParts
);
81 QDomElement element
= m_XmlDoc
.documentElement();
83 QString section_text
= tr("");
85 foreach(QString tag
, tags
) {
86 QDomNodeList nodes
= element
.elementsByTagName(tag
);
87 if (nodes
.size() > 1) {
88 EG_ERR_RETURN(tr("error retrieving XML section '") + name
+ tr("'"));
90 if (nodes
.size() == 0) {
94 if (!nodes
.at(0).isElement()) {
95 EG_ERR_RETURN(tr("error retrieving XML section '") + name
+ tr("'"));
97 element
= nodes
.at(0).toElement();
103 section_text
= element
.text();
108 void XmlHandler::setXmlSection(QString name
, QString contents
) {
109 QStringList tags
= name
.toLower().split(tr("/"), QString::SkipEmptyParts
);
110 QDomElement element
= m_XmlDoc
.documentElement();
112 foreach(QString tag
, tags
) {
113 QDomNodeList nodes
= element
.elementsByTagName(tag
);
114 if (nodes
.size() > 1) {
115 EG_ERR_RETURN(tr("error retrieving XML section '") + name
+ tr("'"));
117 if (nodes
.size() == 0) {
118 QDomElement new_element
= m_XmlDoc
.createElement(tag
);
119 element
.appendChild(new_element
);
120 element
= new_element
;
121 } else if (!nodes
.at(0).isElement()) {
122 EG_ERR_RETURN(tr("error retrieving XML section '") + name
+ tr("'"));
124 element
= nodes
.at(0).toElement();
127 while (element
.hasChildNodes()) {
128 element
.removeChild(element
.firstChild());
130 QDomText text_node
= m_XmlDoc
.createTextNode(contents
);
131 element
.appendChild(text_node
);
132 } catch (Error err
) {
137 QStringList
XmlHandler::allKeys() {
140 dom_node
= m_XmlDoc
.firstChild();
141 parseNode(dom_node
, ret
, dom_node
.nodeName());
145 QStringList
XmlHandler::childGroups() {
148 for (QDomNode sub_node
= m_DomNode
.firstChild(); !sub_node
.isNull(); sub_node
= sub_node
.nextSibling()) {
149 if (sub_node
.nodeType() == QDomNode::ElementNode
) {
150 ret
<< sub_node
.nodeName();
157 QStringList
XmlHandler::childKeys() {
159 qDebug() << "m_DomNode.nodeName()=" << m_DomNode
.nodeName();
160 QString output
= parseNode(m_DomNode
, ret
, m_DomNode
.nodeName());
161 qDebug() << "output=" << output
;
162 qDebug() << "ret=" << ret
;
166 QString
XmlHandler::group(bool absolute
) {
168 return m_DomNode
.nodeName();
171 QString stop_node
= m_XmlDoc
.firstChild().nodeName();
172 QDomNode parent_node
= m_DomNode
;
173 while (!parent_node
.isNull() && parent_node
.nodeName() != stop_node
) {
174 section
= parent_node
.nodeName() + tr("/") + section
;
175 parent_node
= parent_node
.parentNode();
181 void XmlHandler::setGroup(const QString
& prefix
) {
186 void XmlHandler::beginGroup(const QString
& prefix
) {
187 QStringList tag_list
= prefix
.split(tr("/"));
188 foreach(QString tag
, tag_list
) {
189 if (!tag
.isEmpty()) {
190 QDomElement dom_element
= m_DomNode
.toElement();
191 QDomNodeList dom_node_list
= dom_element
.elementsByTagName(tag
);
192 m_DomNode
= dom_node_list
.at(0);
197 void XmlHandler::endGroup() {
198 if (!m_DomNode
.parentNode().isNull()) m_DomNode
= m_DomNode
.parentNode();
201 QString
XmlHandler::parseNode(const QDomNode
& dom_node
, QStringList
& string_list
, QString stop_node
) {
204 if (dom_node
.nodeType() == QDomNode::TextNode
) {
205 QDomNode parent_node
= dom_node
.parentNode();
206 while (!parent_node
.isNull() && parent_node
.nodeName() != stop_node
) {
207 section
= parent_node
.nodeName() + tr("/") + section
;
208 parent_node
= parent_node
.parentNode();
210 string_list
<< section
;
213 for (QDomNode sub_node
= dom_node
.firstChild(); !sub_node
.isNull(); sub_node
= sub_node
.nextSibling()) {
214 parseNode(sub_node
, string_list
, stop_node
);
217 // qDebug() << "section=" << section;
221 void XmlHandler::resetToTopNode() {
222 m_DomNode
= m_XmlDoc
.firstChild();
225 void XmlHandler::resetXmlDoc() {
227 QDomElement root
= m_XmlDoc
.createElement(m_TagName
);
228 m_XmlDoc
.appendChild(root
);