我在使用 Qt QXmlStreamReader (Qt 4.8.1) 检测空元素时遇到了一些麻烦。有一个包含以下部分的 XML 文件
<Groups Number="4">
<Group Id="0" GroupName="Chambers">
<MemberChannels>4,5,6,7,8,9,10,11</MemberChannels>
<AverageShown>true</AverageShown>
</Group>
<Group Id="1" GroupName="Fluids">
<MemberChannels>0,1,17,18</MemberChannels>
<AverageShown>false</AverageShown>
</Group>
<Group Id="2"/>
<Group Id="3"/>
</Groups>
如您所见,Id 为 2 和 3 的元素除了属性外都是空的。该属性不会改变任何东西。如果它不在元素中,问题仍然存在。
这是使用QXmlStreamReader的解析代码,我简化了,可能编译不出来。只是你得到了基本的想法。
[...]
QXmlStreamReader* m_poStreamReader = new QXmlStreamReader;
[...]
if(m_poStreamReader->readNextStartElement() && m_poStreamReader->name().toString() == "Group") {
this->parseGroupElement();
}
[...]
bool CTempscanXmlParser::parseGroupElement( void ) {
TGroupElement tElement;
if(m_poStreamReader->isStartElement() && !m_poStreamReader->isEndElement()) { // not empty
TGroupElement tElement = this->readGroupElement();
} else if(m_poStreamReader->isStartElement() && m_poStreamReader->isEndElement()) { // empty
tElement.oGroupName = QString::null;
}
[...]
}
文档说:
空元素也报告为 StartElement,紧随其后的是 EndElement。
我可以使用 readNext() 并且仍然没有收到结束元素。似乎解析器只能检测到
<tag></tag>
作为一个空元素,但不是
<tag/>
那么,只是我还是 Qt 中存在问题?如果是这样,我如何检测不包含 2 个单独元素(开始/结束)的空元素?
编辑: 所以 Huytard 要求我提供一个工作示例。但他的回答让我找到了一个几乎回答了我的问题的解决方案。因此,我在回答中提出了一个明确的例子。