0

を使用しQXmlStreamReaderて、HTML タグを使用して、リッチ テキスト形式の XML ファイルを作成したいと考えています。たとえば、このファイルでは、<em>テキストを書式設定するために およびその他の HTML タグにアクセスできると便利です。QLabel(そして、Qt を使用すると、HTML を aまたは何かのどこにでも置くことができます。)

<?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)when の開始要素で whenを使用すると、タグが取り除かれ<course-description>たテキストが表示<course-description>されます。たとえば、Welcome to the basic course.

もちろん、コード内のすべての HTML タグを考慮する必要はありません。

4

1 に答える 1

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;
}
于 2015-05-25T10:12:45.350 に答える