假设我们有以下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),以后可以用来访问它们。
答案 0 :(得分:13)
我会为自己的问题添加一个答案。不知道为什么,但看起来我错过了文档中的以下功能。
void QDomNode::save ( QTextStream & str, int indent ) const
它几乎可以将节点转换为字符串,例如:
QString str;
QTextStream stream(&str);
QDomNode node = xml->documentElement().firstChildElement("child");
node.save(stream, 4 /*indent*/);
// process str
答案 1 :(得分:0)
由于您需要XML格式本身,因此您不需要QDomElement
或QDomDocument
。 {strong}用于获取XML文档中存储的数据,QDomElement
和QDomDocument
。
您只需要一个普通的文件遍历。
使用
打开文件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文件中的每一行。您可以遍历它并获得所需的感兴趣线。
希望它有所帮助...
答案 2 :(得分:0)
我认为你不能用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()+">";
}