Разрешить вручную внутренние сущности XML

Я использую 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, если это требуется для его работы.

1 ответ

Решение

Я нашел один способ сделать это, хотя это скорее взлом, чем правильное решение, так как это не мешает 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) и вместо этого просто обработать разрешение в startEntity или же endEntity,

Другие вопросы по тегам