将QDomElement转换为QString/Container类

Rou*_*uta 9 qt qtxml

假设我们有以下XML文档:

<root>
    <options>
        ...
    </options>
    <children>
        <child name="first">12345</child>
        <child name="second">
            <additionalInfo>abcd</additionalInfo>
    </children>
</root>
Run Code Online (Sandbox Code Playgroud)

我想获得"子"节点的字符串表示并将它们附加到数组中(我不想丢失XML语法,所以.text()不是一个选项).例如,第一个孩子看起来像:

QString child = "<child name="first">12345</child>";
Run Code Online (Sandbox Code Playgroud)

我使用以下代码来获取元素:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是doc.isNull总是返回false(看起来我无法将元素转换为文档).有什么方法可以执行此操作吗?

编辑:

我想补充说QString在这里不是强制性的.基本上任何可以在以后用于检索数据的类都可以(我将保存这些节点并使用它们稍后初始化其他对象).重要的是,即使原始文档被销毁,我也应该能够访问这些值.例如,可以将这些元素直接存储到某个数组(例如QList),以后可以用它来访问它们.

Rou*_*uta 16

我将为自己的问题添加一个答案.不知道为什么,但看起来我错过了文档中的以下功能.

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
Run Code Online (Sandbox Code Playgroud)

  • 相反的操作呢?给定字符串,生成QDomNode,可以稍后将其附加到现有QDomDocument吗? (2认同)