0

使用QXmlStreamReader,我希望使用 HTML 标记获得具有富文本格式的 XML 文件。<em>例如,在这个文件中,如果可以访问其他 HTML 标记来格式化文本,那就太好了。(并且使用 Qt,我可以将 HTML 放在任何地方,在 aQLabel或其他东西中。)

<?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 ,则会<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 回答