使用QXmlStreamReader在XML文档中读取嵌入的HTML

时间:2015-05-24 10:57:21

标签: html c++ xml qt qxmlstreamreader

使用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标记。

1 个答案:

答案 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;
}