0

QXmlSimpleReader用来解析其中包含内部定义的实体的 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 阅读器。

4

1 回答 1

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),而是只处理startEntityor中的分辨率endEntity

于 2016-03-07T18:45:01.633 回答