2016-03-07 63 views
0

我正在使用QXmlSimpleReader解析其中包含内部定义实体的XML文件,例如,手动解析内部XML实体

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root [ 
<!ELEMENT root (#PCDATA)> 
<!ENTITY ent "some internally defined entity"> 
]> 
<root> 
text &ent; text 
</root> 

我处理文件用QXmlDefaultHandler子类,我可以做内部实体的最重要的是有自己的使用情况报告。

默认情况下,所有内部定义的实体(上例中的&ent;)都会自动替换为字符。我怎样才能改变这种行为,以便我可以指定它们应该被替换的字符串?如果需要这样做,我也可以切换到另一个Qt的XML阅读器。

回答

0

我找到了一种方法来做到这一点,尽管它更像是一种黑客,然后是一个合适的解决方案,因为它不会阻止Qt实际上用已解决的替换实体字符。这只是解决这些字符被忽略的解决方法。

首先,通过设置适当的功能使QXmlSimpleReader报告实体和处理内容和词汇信息:

QXmlSimpleReader xmlReader; 
xmlReader.setFeature("http://qt-project.org/xml/features/report-start-end-entity", true); 
xmlReader.setContentHandler(handler); 
xmlReader.setLexicalHandler(handler); 

接下来,在上面的handler,覆盖bool QXmlLexicalHandler::startEntity(const QString &name)bool QXmlLexicalHandler::endEntity(const QString &name)和保持状态中,读者是否目前正在读一个实体。如果是这样,只需忽略来自bool QXmlContentHandler::characters(const QString &ch)的输入,而只需处理startEntityendEntity中的分辨率。