11

假设我们有以下 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)中,以便以后访问它们。

4

3 回答 3

19

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

void QDomNode::save (QTextStream & str, int indent) 常量

它几乎可以完成将节点转换为字符串所需的所有工作,例如:

QString str;
QTextStream stream(&str);
QDomNode node = xml->documentElement().firstChildElement("child");

node.save(stream, 4 /*indent*/);

// process str
于 2010-07-27T06:38:55.893 回答
0

由于您需要 XML 格式本身,因此您不需要QDomElementQDomDocument. QDomElementQDomDocument用于获取存储在 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 文件中的每一行。您可以遍历它并获得所需的兴趣线。

希望能帮助到你...

于 2010-07-14T09:15:09.033 回答
0

好吧,我认为你不能完全用 Qt XML 类做你想做的事,但应该可以根据 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()+">";
}
于 2010-07-14T10:15:58.567 回答