私がやったことは、そうでなければ呼び出す場所で使用できるメソッドを作成すること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;
}