Преобразование QDomElement в класс QString/Container
Вопрос
Допустим, у нас есть следующий XML-документ:
<root>
<options>
...
</options>
<children>
<child name="first">12345</child>
<child name="second">
<additionalInfo>abcd</additionalInfo>
</children>
</root>
Я хотел бы получить строковое представление «дочерних» узлов и добавить их в массив (я не хочу терять синтаксис XML, поэтому .text() не является вариантом).Например, первый ребенок будет выглядеть так:
QString child = "<child name="first">12345</child>";
Для получения элементов я использовал следующий код:
QDomDocument doc;
QDomElement element;
element = xml->documentElement();
if(element.isNull() == false)
{
element = element.firstChildElement("children");
if(element.isNull()) return;
element = element.firstChildElement("child");
while(element.isNull() == false)
{
doc = element.toDocument();
if(doc.isNull() == false)
{
// save string into array
array.append(doc.toString());
}
element = element.nextSiblingElement("child");
}
}
Проблема в том, что doc.isNull всегда возвращает false (похоже, я не могу преобразовать элемент в документ).Есть ли способ, как я могу это сделать?
Редактировать:
Я хотел бы добавить, что QString здесь не является обязательным.По сути, подойдет любой класс, который позже можно будет использовать для получения данных (я сохраню эти узлы и буду использовать их для инициализации других объектов позже).Важно то, что я должен иметь доступ к этим значениям, даже если исходный документ был уничтожен. Например, можно сохранить эти элементы непосредственно в каком-то массиве (например,QList), который можно использовать для доступа к ним позже.
Решение
Я добавлю ответ на свой вопрос.Ничего не имею, почему, но выглядит так, будто я пропустил следующую функцию в документации.
void qdomnode :: Сохранить (qtextStream & str, int change) const
Это значительно все, что мне нужно преобразовать узел в строку, например, a.g:
QString str;
QTextStream stream(&str);
QDomNode node = xml->documentElement().firstChildElement("child");
node.save(stream, 4 /*indent*/);
// process str
. Другие советы
Поскольку вам нужен сам формат XML, вам не нужен QDomElement
или QDomDocument
. QDomElement
и QDomDocument
используются чтобы получить данные, хранящиеся в XML-документах.
Вам просто нужен обычный обход файла.
Откройте файл, используя
bool QFile::open ( OpenMode mode ) [virtual]
Вы можете прочитать все содержимое файла,
QByteArray QIODevice::readAll ()
которому вы можете назначить его QString
.
Например,
QString entireContents = xmlFile->readAll();
Затем вы можете разделить все содержимое на основе новая линия \n
персонаж, использующий
QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
Теперь каждый индекс соответствует каждой строке XML-файла.Вы можете пройти через него и получить желаемые линии интереса.
Надеюсь, поможет...
Ну, я думаю, вы не можете сделать необработанно то, что вы хотите с классами QT XML, но должно быть возможно просто восстановить строку самостоятельно (возможно, не соответствовать оригиналу на 100%, но с тем же знаком), основываясь наМетоды классов QT XML обеспечивают.
<Сильные> Редактировать: Маленький кодовый фрагмент, который может сделать вещь (непроверенная):
QString domElementToRawXML(const QDomElement& elem)
{
QString head = "<"+elem.tagName();
QDomNamedNodeMap attrs = elem.attributes();
for(int i = 0; i<attrs.size(); ++i)
{
QDomAttr attr = attrs.item(i).toAttr();
head +=
QString::fromLatin1(" %0=\"%1\"")
.arg(attr.name())
.arg(attr.value());
}
head += ">";
return head + elem.text() + "</"+elem.tagName()+">";
}
.