Qt 将QdomeElement转换为QString/容器类

Qt 将QdomeElement转换为QString/容器类,qt,qtxml,Qt,Qtxml,假设我们有以下XML文档: <root> <options> ... </options> <children> <child name="first">12345</child> <child name="second"> <additionalInfo>abcd</additionalInfo&g

假设我们有以下XML文档:

<root>
    <options>
        ...
    </options>
    <children>
        <child name="first">12345</child>
        <child name="second">
            <additionalInfo>abcd</additionalInfo>
    </children>
</root>
问题是doc.isNull总是返回false(看起来我无法将元素转换为文档)。我有什么办法可以做到这一点吗

编辑:


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

因为您需要XML格式本身,所以不需要
QDomElement
QDomDocument
qdomeElement
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类做你想做的事情,但是你应该可以自己根据Qt-XML类提供的方法简单地重建字符串(可能不是100%匹配原始字符串,但意义相同)

编辑: 可能会执行此操作的小代码段(未经测试):

QString-domElementToRawXML(const-QDomElement&elem)
{
QString head=“”;
返回head+elem.text()+“”;
}

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

它几乎完成了将节点转换为字符串所需的全部工作,例如:

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

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

// process str

请回答。我使用这些QDom*类是因为在讨论操作之前,我还需要解析/获取大量数据。这就是为什么我很好奇这些是否可以通过这些类(或任何QtXml类)来实现。我知道“手动”解析文档是可能的,并且它可能与简单的文档一起工作。但是,在我的情况下,文档可能非常复杂,我需要在多个位置执行类似的操作。基本上我只知道在XML树的某个级别上应该有一个节点,我需要得到它下面的每个分支。谢谢你的回复。基于这些答案,看起来我不得不放弃保存节点(作为字符串)的策略,并找出其他方法。相反的操作呢?给定该字符串,生成一个QDomNode,该QDomNode可以在以后附加到现有QDomDocument?@Pierluigi,这本身就是一个问题。这相当复杂。创建一个
QDomDocument
,使用
setContent()
,然后使用
QDomDocumentFragment
将结果复制到另一个文档中…注释/*=4*未关闭。这里是syntaxis error.
不知道为什么,但看起来我错过了下面的函数
,可能是因为没有人期望
保存
,我们通常会查找serialize或toByteArray或toXmlString。。。
QStringList QString::split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
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()+">";
}
QString str;
QTextStream stream(&str);
QDomNode node = xml->documentElement().firstChildElement("child");

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

// process str