Прочитайте XML-файл, содержащий текст и изображение, и отобразите его в QtextEdit

Если вы просто пытаетесь найти эти теги (без амбиций синтаксического анализа), попробуйте это регулярное выражение:

/<[^/]*?>/g

Я написал его через 30 секунд и протестировал здесь: http: //gskinner.com/RegExr/

Он соответствует типам тегов, о которых вы упомянули, игнорируя типы, которые вы сказали игнорировать.

0
задан Phins 17 January 2019 в 17:38
поделиться

1 ответ

1113 Вот небольшой пример. Я игнорирую идентификаторы в моем случае. Конвертируйте ваш xml в html:

QString MainWindow::HtmlFromXml(const QString &xmlFileName)
{
    QFile file(xmlFileName);
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "Cant open file: " << file.errorString();
        return "";
    }

    QDomDocument htmlDoc;
    QDomElement htmlRoot = htmlDoc.createElement("html");

    QDomDocument xmlDoc;
    xmlDoc.setContent(&file);
    QDomElement xmlRoot = xmlDoc.documentElement();
    QDomElement xmlItem = xmlRoot.firstChild().toElement();

    while(!xmlItem.isNull())
    {
        //read xml
        int itemId = xmlItem.attribute("id", "0").toInt();
        QString itemName = xmlItem.attribute("Name", "");

        QDomElement xmlImg = xmlItem.firstChild().toElement();
        QString imgSrc;
        int imgId = 0;
        if (!xmlImg.isNull()) {
            imgSrc = xmlImg.attribute("src", "");
            imgId = xmlImg.attribute("id", "0").toInt();
        }

        //create html
        QDomElement htmlItem = htmlDoc.createElement("p");

        QDomElement htmlImg = htmlDoc.createElement("img");
        htmlImg.setAttribute("src", imgSrc);

        QDomElement htmlText = htmlDoc.createElement("p");
        QDomText textName = htmlDoc.createTextNode(itemName);
        htmlText.appendChild(textName);

        htmlItem.appendChild(htmlImg);
        htmlItem.appendChild(htmlText);
        htmlRoot.appendChild(htmlItem);

        //next
        xmlItem = xmlItem.nextSibling().toElement();
    }

    htmlDoc.appendChild(htmlRoot);

    return htmlDoc.toString();
}

Затем установите html, который вы получили в QTextEdit

QString strHtml = HtmlFromXml(fileName);
ui->textEdit->setHtml(strHtml);

Теперь вы можете редактировать в QTextEdit. Перед сохранением необходимо получить html из QTextEdit

QString strHtml = ui->textEdit->toHtml();
QString strXml = XmlFromHtml(strHtml);

и преобразовать этот html в xml

QString MainWindow::XmlFromHtml(const QString &strHtml)
{
    QDomDocument xmlDoc;
    QDomElement xmlRoot = xmlDoc.createElement("Stage");

    QDomDocument htmlDoc;
    htmlDoc.setContent(strHtml);
    QDomElement htmlRoot = htmlDoc.documentElement();
    QDomElement htmlHead = htmlRoot.firstChild().toElement();
    QDomElement htmlBody = htmlHead.nextSibling().toElement();

    int dummyId = 1;
    QDomElement htmlItem = htmlBody.firstChild().toElement();
    while (!htmlItem.isNull())
    {
        //<p><img/></p><p>text</p>
        QDomElement htmlImg = htmlItem.firstChild().toElement();
        QString imgSrc = htmlImg.attribute("src", "");

        htmlItem = htmlItem.nextSibling().toElement(); //move to <p> with text
        QDomText itemText = htmlItem.firstChild().toText();

        //create xml elements
        QDomElement xmlItem = xmlDoc.createElement("Item");
        xmlItem.setAttribute("id", dummyId);
        xmlItem.setAttribute("Name", itemText.data());

        QDomElement xmlImg = xmlDoc.createElement("image");
        xmlImg.setAttribute("src", imgSrc);
        xmlImg.setAttribute("id", dummyId);

        xmlItem.appendChild(xmlImg);
        xmlRoot.appendChild(xmlItem);

        //next
        htmlItem = htmlItem.nextSibling().toElement();
        dummyId++;
    }

    xmlDoc.appendChild(xmlRoot);
    return xmlDoc.toString();
}

, а затем сохранить в текстовый файл.

Примечание: QTextEdit позволяют редактировать текст, но имеют некоторые проблемы с изображениями. Вы можете удалять или копировать / вставлять изображения внутри QTextEdit, но не можете вставлять изображения из внешнего буфера обмена. Это потому, что QTextEdit работает с текстовым тегом <img/>, а не с изображением. Чтобы редактировать ваши изображения внутри QTextEdit, вам нужно отредактировать текст HTML вашего экземпляра QTextEdit.

0
ответ дан Serhiy Kulish 17 January 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: