С помощью QXmlStreamReader
Я хотел бы иметь XML-файлы с расширенным форматированием текста, используя теги HTML. Например, в этом файле было бы неплохо иметь доступ к <em>
и другие теги HTML для форматирования текста. (А с помощью Qt я могу поместить HTML где угодно, в QLabel
или что-то.)
<?xml version="1.0" encoding="UTF-8"?>
<course name="Introductory Course">
<course-description>Welcome to the <em>basic course</em>.</course-description>
</course>
Если я использую QXmlStreamReader::readElementText(QXmlStreamReader::IncludeChildElements)
когда в начале элемента <course-description>
Я получаю текст внутри <course-description>
например, лишенный тегов Welcome to the basic course.
Конечно, я хотел бы сделать это без необходимости учитывать каждый тег HTML в моем коде.
В итоге я создал метод, который я мог бы использовать в тех местах, где в противном случае я бы вызвал QXmlStreamReader::readElementText
, В файле XML я помечаю тег с пространством имен XHTML:
<?xml version="1.0" encoding="UTF-8"?>
<course name="Introductory Course">
<course-description xmlns="http://www.w3.org/1999/xhtml">Welcome to the <em>basic course</em>.</course-description>
</course>
Затем всякий раз, когда я читаю тег с QXmlStreamReader
, Я могу позвонить readHtml
, Если элемент имеет пространство имен XHTML, он читает и возвращает все элементы, пока не достигнет закрывающего элемента. (Это означает, что элемент с тем же именем, что и элемент, содержащий пространство имен (<course-description>
выше), не может быть включен в код HTML.)
QString MyClass::readHtml(QXmlStreamReader &xml)
{
if( xml.namespaceUri().toString() != "http://www.w3.org/1999/xhtml" )
{
return xml.readElementText(QXmlStreamReader::IncludeChildElements);
}
QString terminatingElement = xml.name().toString();
QString html;
QXmlStreamWriter writer(&html);
do
{
xml.readNext();
switch( xml.tokenType() )
{
case QXmlStreamReader::StartElement:
writer.writeStartElement(xml.name().toString());
writer.writeAttributes(xml.attributes());
break;
case QXmlStreamReader::EndElement:
writer.writeEndElement();
break;
case QXmlStreamReader::Characters:
writer.writeCharacters(xml.text().toString());
break;
// a more thorough approach would handle these; enumerating them removes a compiler warning
case QXmlStreamReader::NoToken:
case QXmlStreamReader::Invalid:
case QXmlStreamReader::StartDocument:
case QXmlStreamReader::EndDocument:
case QXmlStreamReader::Comment:
case QXmlStreamReader::DTD:
case QXmlStreamReader::EntityReference:
case QXmlStreamReader::ProcessingInstruction:
break;
}
}
while (!xml.atEnd() && xml.name() != terminatingElement );
return html;
}