用QXmlStreamReader解析DTD也非常方便,方法与解析CDATA一样,只是换了个判断函数:
while (!m_xmlReader.isDTD()) { m_xmlReader.readNext(); } auto item = new QTreeWidgetItem(QStringList("[DTD]")); item->setText(1, m_xmlReader.text().toString()); item->setBackgroundColor(1, QColor(Qt::darkMagenta)); m_treeWidget.addTopLevelItem(item); 解析Xml 注释Xml 的注释也与HTML相同,<!-- XXXXXXXXXXXXXXXXXXX -->,代码与上一小节基本一样,只是判断处改用了QXmlStreamReader::isComment()。
while (!m_xmlReader.isComment()) { m_xmlReader.readNext(); } ... 解析Xml Processing InstructionXMl PI(Processing Instruction) 处理指令使用这种格式<?PITarget PIContent?>,前一部分是Target,后一部分是Content。Processing Instruction用来告诉Xml应用程序进行一些Xml以外的操作,例如在有一些应用中,Xml文件需要包含一些CSS文件用以应用样式来渲染自身:
<?xml-stylesheet type="text/css" href="http://www.likecs.com/tutorials.css"?>在QXmlStreamReader中,好像紧贴<?的被识别位Target,后面的内容都被认为是Content:
while (!m_xmlReader.isProcessingInstruction()) { m_xmlReader.readNext(); } auto item = new QTreeWidgetItem(QStringList("[ProcessingInstruction]")); item->setText(1, "target: " + m_xmlReader.processingInstructionTarget().toString() + " content: " + m_xmlReader.processingInstructionData().toString()); item->setBackgroundColor(1, QColor(Qt::yellow)); m_treeWidget.addTopLevelItem(item);获取PI相关内容需要分别调用QXmlStreamReader::processingInstructionTarget(),QXmlStreamReader::processingInstructionData()。
示例运行结果因为Xml的元素是自定义的,这就意味着往往不同的Xml内部的元素结构都不一样,不同的约定格式需要编写不同的逻辑代码处理。这个示例我们用QTreeWidget来展示解析出来的结构和内容:
完整代码见链接。