Чтение встроенного HTML в документе XML с помощью QXmlStreamReader

С помощью 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 в моем коде.

1 ответ

В итоге я создал метод, который я мог бы использовать в тех местах, где я бы иначе вызвал 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;
}
Другие вопросы по тегам