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
我正在尝试创建一个非常有用的函数来读取一个非常简单的 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