Russian Qt Forum

Qt => XML => Тема начата: Scotty от Октябрь 15, 2009, 16:33



Название: Как сравнивать строки из XML файла с ключами
Отправлено: Scotty от Октябрь 15, 2009, 16:33
Есть простенькая проблемка, я пробегаюсь по большому количеству xml документов и проверяю некоторые ключи во всех нодах, так вот, мне нужно выбирать только те ноды в которых есть в ключах некоторые сочетания слов.
Заголовок XML фала выглядит так:
Код:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
Я прочитываю документ и сравниваю значение ноды на QString::Contain и вывожу значение в консоль. Проблема в том что я уверен на 300% что во всех этих документах есть хотябы одна запись которую я ищу, но вот почему-то при сравнении оно мне не находит схожих записей.
Думаю это из-за проблемы в кодировке ... подскажите как мне сравнивать значение ноды полученой из UTF-8 XML фала с некоторым шаблоном. (Пишу в Qt Creator'e, WinXP)


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: Scotty от Октябрь 15, 2009, 16:44
Прочитал и удивился сам себе, вот жешь каряво пишу, короче говоря нужно примерно вот что:
Код:
<Node name="message 18">
<Prp name="date" type="D" value="40100.0302291204"/>
<Prp name="priority" type="I" value="300"/>
<Prp name="owner id" type="I" value="-1"/>
<Prp name="color" type="I" value="-252645136"/>
<Prp name="id" type="I" value="18"/>
<Prp name="bkcolor" type="I" value="-252645136"/>
<Prp name="message" type="S" value="Информирование"/>
<Prp name="picture" type="S" value=""/>
<Prp name="link" type="S" value=""/>
<Prp name="unit id" type="I" value="0"/>
<Prp name="remarks" type="S" value=""/>
<Prp name="type" type="I" value="0"/>
<Prp name="line no" type="I" value="66"/>
<Prp name="child index" type="I" value="-1"/>
</Node>
В этой ноде надо сравнить параметр message на наличие в нем слова "Информирование" если оно там есть, то надо обработать эту ноду. Так вот, обработка - есть, и достать могу нужную ноду из нужного файла, но вот сравнить на наличие там слова "Информирование" не могу, наверное из-за кодировки. Незнаю вот как. На Форуме поискал и нашел примерно вот что:
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
но не уверен что оно поможет. Подскажите пожалуйста как мне сравнить значение ноды и моего слова на Contain ???


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: sLiva от Октябрь 15, 2009, 19:05
А покажи как читаешь, в отладчике смотрел содержимое?


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: Scotty от Октябрь 15, 2009, 20:12
Только не смейтесь на глуппость кода, я только учусь ... Это последний вариант. Просто уже не понимаю что писать ...
Код:
    QDomNode root = xmlDocument->childNodes().item(1).childNodes().item(0);
    int nodeCount = root.childNodes().count();

    for (int i = 0;i < nodeCount;i++){
        if (QString(root.childNodes().item(i).childNodes().item(10).attributes().item(1).nodeValue()).contains(QString("Информация") ,Qt::CaseInsensitive)){
            qDebug() << "Messages : " + (root.childNodes().item(i).childNodes().item(10).attributes().item(1).nodeValue());
        }
    }


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: Scotty от Октябрь 15, 2009, 21:29
При этом я вот одного понять не могу, если я пишу на англисском, то всё хокей, стоит только попробовать кирилицу - сразу нефига не работает.


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: BRE от Октябрь 15, 2009, 21:35
При этом я вот одного понять не могу, я когда пишу на англисском, то всё хокей, стоит только попробовать кирилицу - сразу нефига не работает.
Так и должно быть.  :)
Почитай про строки в Qt, про QTextCodec, про QObject::tr, про кодировки. На форуме в куче тем поднимались подобные вопросы. Поищи.  ;)


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: Scotty от Октябрь 15, 2009, 21:56
 :-\ может быть я чего не понимаю, но поискал по форуму и нашел мол перед открытием файла надо установить кодек:
Код:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
И при каждом обращении пользоваться этим объектом ... пробовал не помогает ... Помогите пожалуйста! Я пока что ещё раз перечитаю главу про строки в Qt ... :'(


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: BRE от Октябрь 15, 2009, 22:08
:-\ может быть я чего не понимаю, но поискал по форуму и нашел мол перед открытием файла надо установить кодек:
Код:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
И при каждом обращении пользоваться этим объектом ... пробовал не помогает ... Помогите пожалуйста! Я пока что ещё раз перечитаю главу про строки в Qt ... :'(

В QString строка храниться в UNICODE. Ты набираешь свои исходники в другой кодировке (win - cp1251, linux - utf8 или koi8r).
Что бы кириллица из исходников корректно преобразовалась в UNICODE, нужно сделать дополнительные телодвижения.

Нужно настроить (например в функции main) кодек который будет использоваться для "сишных" строк:
Код
C++ (Qt)
QTextCodec::setCodecForCString( QTextCodec::codecForLocale() );
 

или использовать функцию QObject::tr(). Т.е. все строки помещать в нее:
Код
C++ (Qt)
contains( tr( "Информация" ) );
 
и установить кодек для tr:
Код
C++ (Qt)
QTextCodec::setCodecForTr( QTextCodec::codecForLocale() );
 

Но! Не рекомендуется задавать константные строки в национальные кодировки. Почитай раздел Internationalization в assistant.


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: Scotty от Октябрь 21, 2009, 18:07
Не помогает, в консоль не выводит ничего.


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: break от Октябрь 22, 2009, 00:42
1) при работе с XML удобно использовать метод QDomElement elementsByTagName - он выберет в список QDomElement-ов все с заданным именем тега рекурсивно в вашем случае имя тега Prp

2) Для решения проблемы сравнения вам надо 100% точно понять в какой кодировке XML и в какой исходник программы - как вам подсказали выше судя по заголовку XML он в UTF8, а если программа ваша в Windows пишется то 90% что кодировка исходников WIN1251

Выведите проходя по циклу в QDebug() << значение ноды из очережной строки << эталонная нода;

если у вас кодировки не соответствуют - то в одном из выражений будут каракули - дальше можно эксперементировать с установкой кодека как описали вам выше или еще использовать для эталонного выражения ф-ции в зав-сти от вашей кодировки исходников:

QString fromAscii ( const char * str, int size = -1 )
QString fromLatin1 ( const char * str, int size = -1 )
QString fromLocal8Bit ( const char * str, int size = -1 )
QString fromStdString ( const std::string & str )
QString fromStdWString ( const std::wstring & str )
QString fromUcs4 ( const uint * unicode, int size = -1 )
QString fromUtf8 ( const char * str, int size = -1 )
QString fromUtf16 ( const ushort * unicode, int size = -1 )



Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: whirlwind от Октябрь 22, 2009, 10:20
2) Для решения проблемы сравнения вам надо 100% точно понять в какой кодировке XML и в какой исходник программы - как вам подсказали выше судя по заголовку XML он в UTF8, а если программа ваша в Windows пишется то 90% что кодировка исходников WIN1251
Как по-моему, совершенно вредный совет. Ни в коем случае программа не должна зависеть от кодировки своего исходного файла. А если вдруг понадобится потом на linux/mac портировать? или, как оно бутет в trac просматриваться? или вдруг нужно будет строку на другом языке искать, немецком, например.

как уже тут советовали, лучше сразу прочитать про Internationalization


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: break от Октябрь 22, 2009, 11:05
Цитировать
Ни в коем случае программа не должна зависеть от кодировки своего исходного файла.

Она всегда от этого зависит, если работает с выводом строк и требуется задать константу char* - ов.
Просто нужно исходники содержать в UTF8 - кодировка которая есть везде в которой есть все языки и никаких проблем, а раз исходники в WIN1251 - то проблемы при переходе на MAC, UNIX и др. Так и так будут - например русские комментарии.


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: whirlwind от Октябрь 22, 2009, 12:30
О, русские комментарии (и вообще комментарии на национальных языках) -- это тоже зло :) Я как-то раз столкнулся с программой котрая была замечательно откомментирована, но на польском :)

Хотя, конечно, зависит от ситуации, иногда лучше не заморачиваться


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: lit-uriy от Октябрь 22, 2009, 13:07
>>и вообще комментарии на национальных языках
Стал быть надо их писать на Эспиранто


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: break от Октябрь 22, 2009, 14:12
Цитировать
О, русские комментарии (и вообще комментарии на национальных языках) -- это тоже зло 

При программировании некоторой запутанной логики, можно вполне использовать национальную кодировку для комментариев. Кроме того некоторые удобные сокращения и специфические термины не переводимы на другие языки - а писать транслитом это маразм.


Название: Re: Как сравнивать строки из XML файла с ключами
Отправлено: Scotty от Октябрь 24, 2009, 23:04
Мда пытался по разному, но чего то никак ... перечитал кучу статей, наверное надо ещё пару куч прочитать, запутался окончательно я в кодировках, куда и чего выводит, откуда что читает ... всё ... мозги закипели ...