URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9659
[ Назад ]

Исходное сообщение
"XML, Perl"

Отправлено drake0103 , 29-Мрт-13 10:56 
Здраствуйте, скрипт должен брать данные из XML и записывать в mysql:
Код XML

<?xml version="1.0"?>
<dataset>
<dataset>
<mailbox>
  <username>bion</username>
  <name>ТОВ Бион</name>
  <active>0</active>
</mailbox>
<mailbox>
  <username>romeo</username>
  <name>Жених Джульеты</name>
  <active>1</active>
</mailbox>
<mailbox>
  <username>kamaz</username>
  <name>Russian car</name>
  <active>1</active>
</mailbox>
</dataset>

Таблица MYSQL:

username name active
bion Бион 1
kamaz Russian car 1
romeo Romeo 1


#!/usr/bin/perl -w

        use strict;
        use DBI;
        use XML::XPath;

#Параметры подключения к базе

my $db_host="";
my $db_name="";
my $db_user="";
my $db_pass="";


#Подключение к базе данных

my $dbh = DBI->connect("dbi:mysql:$db_name:$db_host", "$db_user", "$db_pass") || die $DBI::errstr;

#Говорим что мы будем использовать UTF-8, во избежания проблем с кодировками в DB.
$dbh->{'mysql_enable_utf8'} = 1;
$dbh->do('SET NAMES utf8');


#Функция запроса в MySQL
sub msq{
    my $sth = $dbh->prepare("$_[0]");
    $sth->execute;
    return $sth;
}


#Функция сравнение статус юзера и статус в xml

sub mysqlxml{

my $x=msq ("SELECT active FROM mailbox where `username` = '$_[0]'");
if ( $x->rows == $_[1])
{
return 0;
}
else
{
return 1;
}
}

#Функция апдейта юзеров
sub msql{
    my $sth = $dbh->prepare("UPDATE  mailbox SET  `active` = '$_[0]' WHERE  `username` = '$_[1]'");
    $sth->execute;
    return $sth;
}

my $xp = XML::XPath->new(filename => 'mail.xml');
my $nodes="/dataset/mailbox";


# Цикл поиска и записи

foreach my $row ($xp->findnodes("$nodes")) {

# Извлечение данный из XML

    my $email = $row->find('username')->string_value;
    my $active = $row->find('active')->string_value;
    my $username = "$email\@dot.com";


        if (mysqlxml($username, $active) == 1)
  {
       print "$username - change status on $active\n";
       msql ($active, $username);
  }
        else
  {
        printf "$username - no changes\n";
        #printf "$username - already exists\n";
  }
}
$dbh->disconnect;

Вот если в XML <active>1</active> а в базе 0 то нечего не меняется, а если на оборот то меняет значение на 0.
Где я не доделал?
Что б в всех случаях записывало те данные что и в XML


Содержание

Сообщения в этом обсуждении
"XML, Perl"
Отправлено drake0103 , 29-Мрт-13 17:57 

Все, пофиксил.