LINUX.ORG.RU

QT4 XML и «&#39» и др


0

0

Использую QDomElement, QDomNode и т.д. для парсинга XML, полученые результаты вывожу в listview и прочие, вместо апострофов выводит «&#39», ибо в таком виде они должны лежать в xml по стандарту (вроде как). Собственно вопрос, как превратить их в апострофы, str.replace, мне кажется это костыль.

Если делать нормально, то спецсимволы автоматически раскрываются обратно из кодов, у тебя в каком-то месте косяк.
Показывай как парсишь и выводишь. И исходный XML тоже.

nu11 ★★★★★
()
Ответ на: комментарий от nu11

// тут движок лора автоматом заменил &#39 ; на апостроф

<?xml version="1.0" encoding="utf-8"?>
<response list="true">
 <audio>
  <aid>80335623</aid>
  <owner_id>54002409</owner_id>
  <artist>The Trashmen</artist>
  <title>Surfin' Bird </title>
  <duration>144</duration>
  <url>http://cs4887.vkontakte.ru/u3968995/audio/381fb6cc6ba0.mp3</url>
  <lyrics_id>5268704</lyrics_id>
 </audio>
.........................

void MainWindow::ProcessingOfRequest(QString result)
{
    QDomDocument doc;
    QString errorStr;
    int errorLine;
    int errorColumn;
    if (!doc.setContent(result, true, &errorStr, &errorLine, &errorColumn))
    {
        return;
    }
    ui->musicLw->clear();
    QDomElement root = doc.documentElement();
    if (root.attribute("list") == "true")
    {
        QDomNode node = root.firstChild();
        while (!node.isNull())
        {
            if (node.toElement().tagName() == "audio")
            {
                QDomNode node2 = node.firstChild();
                if (!node2.isNull())
                {
                    QString aritst, title, url;
                    while (!node2.isNull())
                    {
                        if (node2.toElement().tagName() == "artist")
                            aritst = node2.firstChild().toText().data();
                        if (node2.toElement().tagName() == "title")
                            title =  node2.firstChild().toText().data();
                        if (node2.toElement().tagName() == "url")
                            url =  node2.firstChild().toText().data();
                        node2 = node2.nextSibling();
                    }
                    QListWidgetItemMusic* it = new QListWidgetItemMusic;
                    it->setArtist(aritst);
                    it->setTitle(title);
                    it->setUrl(url);
                    it->setText(aritst + " - " + title);
                    ui->musicLw->addItem(it);
                }
            }
            node = node.nextSibling();
        }
    }
}
Pentium02 ★★
() автор топика
Ответ на: комментарий от Pentium02

Временно наваял такой костыль

QString FromXmlStr(const QString &str)
{
    QString xml = str;
    xml.replace("&amp ;", "&"); //Пробелы перед точкой с запятой что-бы лор не заменил
    xml.replace("&lt ;", "<");
    xml.replace("&gt ;", ">");
    xml.replace("&apos ;", " ");
    xml.replace("&quot ;", "\"");
    QRegExp rx("&#..;");
    int pos = 0;
    while (true)
    {
        pos = rx.indexIn(xml, 0);
        if (pos == -1)
            break;
        xml.replace(xml.mid(pos, 5), QChar(xml.mid(pos+2, 2).toInt(NULL, 10)));
        pos++;
    }
    return xml;
}

Pentium02 ★★
() автор топика
Ответ на: комментарий от Pentium02

Слегка оффтопик, но разве Qt не даёт пользоваться добром вроде XPath? Не лень такую портянку писать?

Deleted
()

У тебя в самом QListWidgetItemMusic где-нибудь никаких ошибок нет? Или данные дважды экранированы. У меня никаких проблем нет [если я делаю всё правильно]. И qDebug() на title говорит, что всё нормально.

Qt 4.6.3

Deleted
()
Ответ на: комментарий от Pentium02

>node2.firstChild().toText().data();

а если так:
node2.firstChild().nodeValue() ?
И попробуй в консоли посмотреть что выводит, может косяк не здесь
qDebug() << node2.firstChild().nodeValue()

ProcessingOfRequest(QString result)


откуда этот самый result приходит?

nu11 ★★★★★
()
Ответ на: комментарий от Deleted

>Слегка оффтопик, но разве Qt не даёт пользоваться добром вроде XPath?
Самому интересно. В QML XPath жуется на ура, а в чистом Qt я его почему-то не нашел...
Хотя немного проще использовать QDomDocument::elementById и QDomDocument::elementsByTagName, но это все равно далеко до идеала

proDOOMman ★★
()
Ответ на: комментарий от proDOOMman

>а в чистом Qt я его почему-то не нашел...

плохо искал. QtXmlPatterns Module

nu11 ★★★★★
()
Ответ на: комментарий от Deleted

Что-то он какой-то тоже страшный…

Deleted
()
Ответ на: комментарий от Karapuz

Нету.

ProcessingOfRequest(QString result)

откуда этот самый result приходит?

В общем, в этом и оказалась проблема. Я общаюсь с сервером (от которого получаю XML) через сокеты (не Qt'шные, т.к. класс для работы с этим сервером была написан ранее, и не предполагалось использовать его с Qt), прочитанный из сокета ответ загоняется в std::string. В QString он преобразуется таким образом

QString xml;
xml = xml.fromUtf8(out.c_str());
Как решить проблему не знаю, разве что попробовать Qt сокеты.

Pentium02 ★★
() автор топика
Ответ на: комментарий от Pentium02

>Я общаюсь с сервером (от которого получаю XML) через сокеты

видимо проблема в сервере. Попробуй получаемый xml вывести в консоль:
qDebug() << result;
Скорее всего там амперсенд (&) дважды преобразован.

nu11 ★★★★★
()
Ответ на: комментарий от nu11

А действительно >_<

"<?xml version="1.0" encoding="utf-8"?>
<response list="true">
 <audio>
  <aid>80335623</aid>
  <owner_id>54002409</owner_id>
  <artist>The Trashmen</artist>
  <title>Surfin&amp ;#39;Bird </title>
  <duration>144</duration>
  <url>http://cs4887.vkontakte.ru/u3968995/audio/3f368e9fe659.mp3</url>
  <lyrics_id>5268704</lyrics_id>
 </audio>

Pentium02 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.