将 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 qoidnode :: save(qtextstream&str,int indent)const
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()+">";
}
. 不隶属于 StackOverflow