Russian Qt Forum
Май 21, 2024, 08:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как сравнивать строки из XML файла с ключами  (Прочитано 13291 раз)
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)
Записан
Scotty
Гость
« Ответ #1 : Октябрь 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 Непонимающий
Записан
sLiva
Гость
« Ответ #2 : Октябрь 15, 2009, 19:05 »

А покажи как читаешь, в отладчике смотрел содержимое?
Записан
Scotty
Гость
« Ответ #3 : Октябрь 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());
        }
    }
« Последнее редактирование: Октябрь 15, 2009, 20:15 от Scotty » Записан
Scotty
Гость
« Ответ #4 : Октябрь 15, 2009, 21:29 »

При этом я вот одного понять не могу, если я пишу на англисском, то всё хокей, стоит только попробовать кирилицу - сразу нефига не работает.
Записан
BRE
Гость
« Ответ #5 : Октябрь 15, 2009, 21:35 »

При этом я вот одного понять не могу, я когда пишу на англисском, то всё хокей, стоит только попробовать кирилицу - сразу нефига не работает.
Так и должно быть.  Улыбающийся
Почитай про строки в Qt, про QTextCodec, про QObject::tr, про кодировки. На форуме в куче тем поднимались подобные вопросы. Поищи.  Подмигивающий
« Последнее редактирование: Октябрь 15, 2009, 21:39 от BRE » Записан
Scotty
Гость
« Ответ #6 : Октябрь 15, 2009, 21:56 »

 В замешательстве может быть я чего не понимаю, но поискал по форуму и нашел мол перед открытием файла надо установить кодек:
Код:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
И при каждом обращении пользоваться этим объектом ... пробовал не помогает ... Помогите пожалуйста! Я пока что ещё раз перечитаю главу про строки в Qt ... Плачущий
Записан
BRE
Гость
« Ответ #7 : Октябрь 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.
« Последнее редактирование: Октябрь 15, 2009, 22:19 от BRE » Записан
Scotty
Гость
« Ответ #8 : Октябрь 21, 2009, 18:07 »

Не помогает, в консоль не выводит ничего.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #9 : Октябрь 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 )

Записан
whirlwind
Гость
« Ответ #10 : Октябрь 22, 2009, 10:20 »

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

как уже тут советовали, лучше сразу прочитать про Internationalization
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #11 : Октябрь 22, 2009, 11:05 »

Цитировать
Ни в коем случае программа не должна зависеть от кодировки своего исходного файла.

Она всегда от этого зависит, если работает с выводом строк и требуется задать константу char* - ов.
Просто нужно исходники содержать в UTF8 - кодировка которая есть везде в которой есть все языки и никаких проблем, а раз исходники в WIN1251 - то проблемы при переходе на MAC, UNIX и др. Так и так будут - например русские комментарии.
Записан
whirlwind
Гость
« Ответ #12 : Октябрь 22, 2009, 12:30 »

О, русские комментарии (и вообще комментарии на национальных языках) -- это тоже зло Улыбающийся Я как-то раз столкнулся с программой котрая была замечательно откомментирована, но на польском Улыбающийся

Хотя, конечно, зависит от ситуации, иногда лучше не заморачиваться
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Октябрь 22, 2009, 13:07 »

>>и вообще комментарии на национальных языках
Стал быть надо их писать на Эспиранто
Записан

Юра.
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #14 : Октябрь 22, 2009, 14:12 »

Цитировать
О, русские комментарии (и вообще комментарии на национальных языках) -- это тоже зло 

При программировании некоторой запутанной логики, можно вполне использовать национальную кодировку для комментариев. Кроме того некоторые удобные сокращения и специфические термины не переводимы на другие языки - а писать транслитом это маразм.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.102 секунд. Запросов: 19.