2016-03-07 8 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; в приведенном выше примере) автоматически заменяются на символы. Как я могу изменить это поведение, чтобы я мог указать, какую строку следует заменить? Я также прекрасно переключаюсь на другой читатель XML Qt, если это необходимо для его работы.

ответ

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) и вместо этого просто обрабатывайте разрешение в startEntity или endEntity.