使用QXmlStreamReader
,我希望使用HTML标记,使用富文本格式的XML文件。例如,在此文件中,访问<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标记。
答案 0 :(得分: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;
}