QT 5.11.3 - QDomNode:无法打印 dom 元素的值

QT 5.11.3 - QDomNode : can't print value of dom element

我正在尝试创建一个非常有用的函数来读取一个非常简单的 XML 文件并在 QTCreator 控制台上打印其内容。

我创建了以下 XML 文件:

<SCANNERS>
    <SCANNER>
        <NAME>Test scanner</NAME>
        <SERIAL>10102030</SERIAL>
    </SCANNER>
    <SCANNER>
        <NAME>Test scanner 2</NAME>
        <SERIAL>10102031</SERIAL>
    </SCANNER>
    <SCANNER>
        <NAME>Test scanner 3</NAME>
        <SERIAL>10102032</SERIAL>
    </SCANNER>
    <SCANNER>
        <NAME>Test scanner 4</NAME>
        <SERIAL>10102033</SERIAL>
    </SCANNER>
    <SCANNER>
        <NAME>Test scanner 5</NAME>
        <SERIAL>10102034</SERIAL>
    </SCANNER>
</SCANNERS>

然后我创建了以下函数,它应该打印每个“SCANNER”标签内的每个节点:

void printDomDocument(QString xml)
{
    QDomDocument xmlScanners;
    QFile file(xml);
    if (!file.open(QIODevice::ReadOnly))
    {
        std::cout << "QScannerEntryList : couldn't open XML file : " << xml.toStdString() << std::endl;

    }
    if (xmlScanners.setContent(&file))
    {
        QDomElement elem = xmlScanners.documentElement();
        QDomNode n = elem.firstChild();
        while (!n.isNull())
        {
            QDomElement e = n.toElement(); // try to convert the node to an element.
            if (!e.isNull())
            {
                QDomNode n2 = e.firstChild();
                std::cout << n2.nodeName().toStdString() << " " << n2.nodeValue().toStdString() << std::endl;
                n2 = n2.nextSibling();
                std::cout << n2.nodeName().toStdString() << " " << n2.nodeValue().toStdString() << std::endl;
            }
            n = n.nextSibling();
        }
    }
    else
    {
        std::cout << "QScannerEntryList : couldn't grab content from XML file : " << xml.toStdString() << std::endl;
    }
    file.close();
}

我的问题是,我可以完美地打印每个节点的标记名,但由于某些原因我无法打印每个这些标记中的值。 n2.nodeValue() 未显示在控制台上。

我做错了什么吗?

发现问题了。

实际上,实际节点值似乎比 child 本身更深一个节点。

解决办法就是简单地“挖”深一层:

QDomNode n2 = e.firstChild();
std::cout << n2.nodeName().toStdString() << " " << n2.firstChild().nodeValue().toStdString() << std::endl;
n2 = n2.nextSibling();
std::cout << n2.nodeName().toStdString() << " " << n2.firstChild().nodeValue().toStdString() << std::endl;

Returns 预期结果:

NAME Test scanner
SERIAL 10102030
NAME Test scanner 2
SERIAL 10102031
NAME Test scanner 3
SERIAL 10102032
NAME Test scanner 4
SERIAL 10102033
NAME Test scanner 5
SERIAL 10102034