Russian Qt Forum

Qt => XML => Тема начата: PulSar.CE3194694 от Август 01, 2011, 15:09



Название: Как читать Enter'ы?
Отправлено: PulSar.CE3194694 от Август 01, 2011, 15:09
День добрый!
Пишу себе читалку Fb2. Нужно прочитать бинарник в тэге <binary> для обложки книги. Значит, написал код, он хорошо работает, но есть проблема. Он не хочет читать именно бинарники. Все остальные данные, заключенные в тэгах читает, а это нет. Похимичев, пришел к выводу, что не читает  их из-за Enter'ов. Вот пример файла (обрезанный):
Код
XML
<binary id="cover.jpg" content-type="image/jpeg">/9j/4QEuRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAAB
AAAAagEoAAMAAAABAAIAAAExAAIAAAAUAAAAcgEyAAIAAAAUAAAAhodpAAQAAAABAAAAnAAA
AMgAAABIAAAAAQAAAEgAAAABQWRvYmUgUGhvdG9zaG9wIDcuMAAyMDAzOjAzOjMxIDEwOjUy
OjI1AAAAAAOgAQADAAAAAf//AACgAgAEAAAAAQAAARigAwAEAAAAAQAAAdIAAAAAAAAABgED
AAMAAAABAAYAAAEaAAUAAAABAAABFgEbAAUAAAABAAABHgEoAAMAAAABAAIAAAIBAAQAAAAB
AAABJgICAAQAAAABAAAAAAAAAAAAAABIAAAAAQAAAEgAAAAB/+0FolBob3Rvc2hvcCAzLjAA
OEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D7QAAAAAAEABIAAAAAQACAEgAAAAB
AAI4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAAAHg4QklNBBkAAAAA
AAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0ECgAAAAAAAQAAOEJJTScQAAAAAAAK
AAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAA
AAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA
/////////////////////////////wPoAAAAAP////////////////////////////8D6AAA
AAD/////////////////////////////A+gAAAAA/////////////////////////////wPo
AAA4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAA
AAADSQAAAAYAAAAAAAAAAAAAAU0AAADIAAAACgBVAG4AdABpAHQAbABlAGQALQAxAAAAAQAA
AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAADIAAABTQAAAAAAAAAAAAAAAAAAAAABAAAA
AAAAAAAAAAAAAAAAAAAAABAAAAABAAAAAAAAbnVsbAAAAAIAAAAGYm91bmRzT2JqYwAAAAEA
AAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21s
b25nAAABTQAAAABSZ2h0bG9uZwAAAMgAAAAGc2xpY2VzVmxMcwAAAAFPYmpjAAAAAQAAAAAA
BXNsaWNlAAAAEgAAAAdzbGljZUlEbG9uZwAAAAAAAAAHZ3JvdXBJRGxvbmcAAAAAAAAABm9y
aWdpbmVudW0AAAAMRVNsaWNlT3JpZ2luAAAADWF1dG9HZW5lcmF0ZWQAAAAAVHlwZWVudW0A
AAAKRVNsaWNlVHlwZQAAAABJbWcgAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQA
AAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAU0AAAAAUmdo
dGxvbmcAAADIAAAAA3VybFRFWFQAAAABAAAAAAAAbnVsbFRFWFQAAAABAAAAAAAATXNnZVRF<binary>
Тут после каждой строки нажата клавиша Enter. Их-за этого в консоль вместо всего этого выводится: "". как быть?


Название: Re: Как читать Enter'ы?
Отправлено: Странник от Август 01, 2011, 15:20
как читаете, как преобразовываете? код в студию!


Название: Re: Как читать Enter'ы?
Отправлено: PulSar.CE3194694 от Август 01, 2011, 15:33
Код:
void Parser::binaryParser(QDomNode node)
{
    QString id = node.attributes().item(1).nodeValue();
    char format = node.attributes().item(0).nodeValue().section("/", -1,-1).toUpper().data()->toAscii();
    QByteArray bytes;
    bytes.append(node.firstChild().toText().data());
    qDebug()<<node.firstChild().toText().data();
    QPixmap *image = new QPixmap();
    image->loadFromData(bytes, &format);
}
Если Enter'ов нет, то все ок. Специально проверял.


Название: Re: Как читать Enter'ы?
Отправлено: Странник от Август 01, 2011, 15:47
где-то вы врете..а преобразование из Base64 где? попробуйте:
Код:
void Parser::binaryParser(QDomNode node)
{
    QString id = node.attributes().item(1).nodeValue();
    char format = node.attributes().item(0).nodeValue().section("/", -1,-1).toUpper().data()->toAscii();
    QByteArray bytes = node.firstChild().toText().data().toLatin1();
    
    QPixmap *image = new QPixmap();
    image->loadFromData(QByteArray::fromBase64(bytes), &format);
}


Название: Re: Как читать Enter'ы?
Отправлено: PulSar.CE3194694 от Август 01, 2011, 16:24
Спасибо, но дело не совсем в этом)
Я извлекаю данные из тэга таким образом: node.firstChild().toText().data(). Так вот если эту инструкцию в qDebug() отправить, то в консоли будет пустая строка. Проблема не в записи в массив, а в извлечении текста картинки из xml документа.


Название: Re: Как читать Enter'ы?
Отправлено: Странник от Август 01, 2011, 17:04
node.toElement().text() что возвращает?


Название: Re: Как читать Enter'ы?
Отправлено: PulSar.CE3194694 от Август 01, 2011, 17:23
Ничего не возвращает. В консоли ничего не появляется, будто qDebug() и вовсе не написан.
Ну вот Вы попробуйте открыть этот бинарник (чтобы в консоли цифры-буквы появились).


Название: Re: Как читать Enter'ы?
Отправлено: kambala от Август 01, 2011, 17:47
а то, что тег заканчивается на <binary> (без слеша) - так и должно быть или опечатка в посте?


Название: Re: Как читать Enter'ы?
Отправлено: Странник от Август 01, 2011, 17:48
опечатка, но работает в любом случае (Qt 4.7.3, Windows). уверены, что правильно парсите?
Код:
QFile file(QString("test.xml"));
file.open(QIODevice::ReadOnly);

QDomDocument document;
document.setContent(&file);

QDomElement element = document.firstChildElement();
qDebug() << element.tagName() << element.attributes().item(0).nodeValue() << element.attributes().item(1).nodeValue() << element.text();
где test.xml содержит приведенный вами пример, парсит на ура. проверяйте входные данные функции.

p.s.
ваш код у меня тоже работает.


Название: Re: Как читать Enter'ы?
Отправлено: SeverusSnape от Август 02, 2011, 09:35
Удалите символ "\n" как  вариант


Название: Re: Как читать Enter'ы?
Отправлено: PulSar.CE3194694 от Август 02, 2011, 09:57
Все, получилось! Странно, чудеса...


Название: Re: Как читать Enter'ы?
Отправлено: Странник от Август 02, 2011, 10:09
Удалите символ "\n" как  вариант
он здесь точно ни при чем. xml-парсеру не мешает, преобразованию из base64 тоже.


Название: Re: Как читать Enter'ы?
Отправлено: SeverusSnape от Август 02, 2011, 12:35
Все, получилось! Странно, чудеса...

Каким образом, если не секрет?


Название: Re: Как читать Enter'ы?
Отправлено: PulSar.CE3194694 от Август 02, 2011, 15:02
Не знаю... Код отсюда скопировал, открыл, получилось. Открыл настоящие книги с бинарями - тоже поучилось.