手动解析内部 XML 个实体
Manually resolve internal XML entities
我正在使用 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 reader 如果需要让它工作的话。
我找到了一种方法,尽管它更像是一种 hack,而不是一种适当的解决方案,因为它不会阻止 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)
并保持 reader 当前是否正在读取实体的状态。如果是,只需忽略来自 bool QXmlContentHandler::characters(const QString &ch)
的输入,而只需处理 startEntity
或 endEntity
.
中的分辨率
我正在使用 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 reader 如果需要让它工作的话。
我找到了一种方法,尽管它更像是一种 hack,而不是一种适当的解决方案,因为它不会阻止 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)
并保持 reader 当前是否正在读取实体的状态。如果是,只需忽略来自 bool QXmlContentHandler::characters(const QString &ch)
的输入,而只需处理 startEntity
或 endEntity
.