Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: помогите с парсером

Сообщения:  [1-10] 

 
 автор: Лена   (09.10.2009 в 10:11)   письмо автору
 
   для: *m*   (08.10.2009 в 11:12)
 

Подключение к базе свое добавьте. У меня просто подключается конфиг-файл.
В вашем xml-документе у вас 4 уровня. Парсим и сразу же помещаем данные в базу.

<?php
//подключение к базе
include ("configs/dbopen.php");

//парсим элемент и сразу же вставляем значения в базу

function start_element($par$name$atr){
global 
$heap;
$tmp = array('data' => '','name' => $name'atr' => $atr); 
$l = ++$heap['level'];
$heap['stack'][$l] = $heap['ref']; 
$heap['ref'] = array('data' => '');
    if(!empty(
$atr)) $heap['ref']['atr'] = $atr;

    
//категории, родитель
    //в xml-документе это уровень 2
    
if($l == 2){
        
$a $atr['NAME'];

        
$sql "INSERT INTO categories(parent_id) VALUES(0)";
        
$res mysql_query($sql);
        if(!
$res) exit("Error in $sql: "mysql_error());

        
$id_cat mysql_insert_id();

        
$sql2 "INSERT INTO categories_description(categories_id,categories_name) VALUES('$id_cat','$a')";
        
$res2 mysql_query($sql2);
        if(!
$res2) exit("Error in $sql2: "mysql_error());
    }

    
//подкатегория, потомок
    //в xml-документе это уровень 3
    
if($l == 3){
        
$sub_a $atr['NAME'];
        
$sql "SELECT MAX(categories_id) dd FROM categories";
        
$res mysql_query($sql);
        if(!
$res) exit("Error in $sql: "mysql_error());
        
$arr mysql_fetch_assoc($res);
        
$parent $arr['dd'];

        
$sql2 "INSERT INTO categories(parent_id) VALUES('$parent')";
        
$res2 mysql_query($sql2);
        if(!
$res2) exit("Error in $sql2: "mysql_error());

        
$sub_id mysql_insert_id();

        
$sql3 "INSERT INTO categories_description(categories_id,categories_name) VALUES('$sub_id','$sub_a')";
        
$res3 mysql_query($sql3);
        if(!
$res3) exit("Error in $sql3: "mysql_error());
    }

    
//товары, заполняем таблицы, связанные с товарами
    //в xml-документе это уровень 4
    
if($l == 4){
        
$id $atr['ID'];
        
$name $atr['NAME'];
        
$descr $atr['OPISANIE'];
        
$active $atr['ACTIVE'];
        
$image $atr['IMAGE'];
        
$ost $atr['OSTATOK']; //вот это в таблицах не найдено
        
$price $atr['CHENA'];

        
$sql "INSERT INTO products_description(products_name,products_description) VALUES('$name','$descr')";
        
$res mysql_query($sql);
        if(!
$res) exit("Error in $sql: "mysql_error());

        
$id_tov mysql_insert_id();

        
$sql2 "INSERT INTO products(products_image,products_status,products_price) VALUES('$image','$active','$price')";
        
$res2 mysql_query($sql2);
        if(!
$res2) exit("Error in $sql2: "mysql_error());
    }
}

function 
end_element($par$name){
global 
$heap
$l = --$heap['level']; $ln $l 1
$tmp $heap['ref']; 
$heap['ref'] = $heap['stack'][$ln]; 
unset(
$heap['stack'][$ln]);
    if(
$l 2)
        
$heap['ref']['sub'][][$name] =  $tmp;
    else
        
$heap['ref']['sub'][$name] =  $tmp;


$file "primer.xml";

if (!(
$fp fopen($file"r"))){ 
die(
"could not open XML input"); 
}

$p xml_parser_create(); 

$heap['level'] = 0
$heap['ref'] = array(); 
xml_set_element_handler($p'start_element''end_element'); 
    while (
$data fgets($fp)){ 
        if (!
xml_parse($p$datafeof($fp))) { 
        echo 
"<br>XML Error: "
        echo 
xml_error_string(xml_get_error_code($xml_parser)); 
        echo 
" at line ".xml_get_current_line_number($xml_parser); 
    break; 
    } 
}

/*
echo '<pre>'; 
print_r($heap); 
echo '</pre>'; 
*/
?>

  Ответить  
 
 автор: *m*   (08.10.2009 в 11:12)   письмо автору
1.6 Кб
 
   для: cheops   (05.10.2009 в 23:10)
 

с помощью одного очень хорошего человека удалось распарсить xml следующим образом:
(в атаче обновленный xml и пример масива)

<?
function startElement($par,$name,$atr){
    
$tmp = array('name' =>$name'atr' =>$atr);
    global 
$heap$l= ++$heap['level'];$lp=$l-1;
    
//$heap['stack'][$l]= $heap['ref']
    
if(!empty($atr)) $heap['ref']['atr']=$atr;
    }
    function 
endElement($par,$name){
        global 
$heap$l= --$heap['level']; $ln=$l+1;
        
$tmp $heap['ref'];
        
$heap['ref']=$heap['stack']['ln'];
        
$heap['ref']['sub']['name'][]=$tmp;
        }
        
$depth 0;
        
$file "primer.xml";

        if(!(
$fp=fopen($file"r"))){
            die(
"could not open XML input");
            }

            while(
$data fgets($fp)){
                
$p xml_parser_create();
                
$heap['level'] = 0;
                
$heap['ref'] = array();
                
xml_set_element_handler($p'startElement','endElement');
                

                if(!
xml_parse($p,$datafeof($fp))){
                    echo 
"XML Error:";
                    echo 
xml_error_string(xml_get_error_code($xml_parser));
                    echo 
"at line".xml_get_current_line_number($xml_parser);
                    break;
                    }
                    }

                    echo 
'';
                    
print_r($heap);
                    echo 
'';
?>


но вот как записать получившийся массив в четыре таблицы в цикле?
при этом нужно чтоб скрипт проверял существует ли такая категоия, если нет, соответственно ее создавал и дальше рекурсивно проходил по ней записывая в нее товар..

или как-то разбить на два скрипта, один будет проходить корень, а второй делать рекурсию..

пожалуйста, помогите, решить данный вопрос..

  Ответить  
 
 автор: *m*   (06.10.2009 в 08:12)   письмо автору
 
   для: cheops   (05.10.2009 в 23:10)
 

ок, буду ждать, я думаю врятли..

  Ответить  
 
 автор: cheops   (05.10.2009 в 23:10)   письмо автору
 
   для: *m*   (05.10.2009 в 17:49)
 

Отпишусь чуть позже, если никто не опередит.

  Ответить  
 
 автор: *m*   (05.10.2009 в 17:49)   письмо автору
 
   для: cheops   (02.10.2009 в 23:13)
 

1

  Ответить  
 
 автор: *m*   (03.10.2009 в 13:44)   письмо автору
333 байт
 
   для: cheops   (02.10.2009 в 23:13)
 

-- я убрал из xml файла несколько ненужных параметров для товара

обновленная структура xml файла:


Element: BASE
   Attribute: VALUE = MAIN
   Element: GROUP
      Attribute: NAME = APARAT
      Element: GROUP
         Attribute: NAME = TELEFON
         Element: TOVAR
            Attribute: ID = 1
            Attribute: NAME = 1
            Attribute: OPISANIE = 1
            Attribute: ACTIVE = 1
            Attribute: IMAGE = path
            Attribute: OSTATOK = 1
            Attribute: CHENA = 1



-- соответсвие с таблицами:

GROUP NAME - это категория в каталоге, у нее соответсвенно может быть сколько угодно подкатегорий. Она соответсвует таблицам categories и categories_description.

TOVAR - товар из группы соответсвуют таблицам products и products_description.

cоотнесение полей таблиц с xml:

по товару:
ID -> products_id
NAME -> products_name
OPISANIE -> products_description
ACTIV -> products_status
IMAGE -> products_image
OSTATOK -> products_quantity
CHENA -> products_price

по группе:
GROUP NAME -> categories_name



-- Я так думаю, что сначало нужно привести массив к такому виду чтобы с ним удобно было работать, чтобы информация заносилась какбы в готовые переменные типа $products_id, $products_name.. итд для записи в БД, но не знаю как это сделать, может как-то по другому нужно разбирать xml?
-- Второе, как я себе это представляю, нужно, чтобы в скрипте проверялась категория (ее id взятое из массива или имя не знаю как правильнее, сравнивалась с записями в БД) и если таковой не существует, она создавалась и в нее записывался соответствующий товар, аналогично для подкатегорий и самого товара, и так в цикле.. Следует также отметить, что для определения категорий в таблице categories, есть два поля categories_id и parent_id (родительский), что тоже нужно учитывать при написание скрипта..
-- Третий момент, - таблиц четыре, данные в них какбы пересекаются ( т.e часть данных для элемента (например товара) должна записаться в одну таблицу, например products, а часть в products_description), и в каждой паре таблиц есть еще и совпадающие поля products_id и categories_id, как всю информацию правильно записать незнаю..(
-- И еще один важный вопрос, касаемо поля id. Будет ли целесообразно, заганять в id_products, тот id который указан в xml? или создать в таблицах дополнительное поле id для id из xml?

(p.s в прикрепленном файле описание используемых полей таблиц)

(p.p.s буду вам очень признателен, если вы приведете код, требуемый в моем данном случае, а я уже потом, буду доделывать его под разные нужды. Bопрос очень насущный..и не терпит отлагательств, я поэтому, вобщем уже и обратился на форум. Спасибо.)

  Ответить  
 
 автор: cheops   (02.10.2009 в 23:13)   письмо автору
 
   для: *m*   (02.10.2009 в 22:30)
 

Что заполняем, какие таблицы? Т.е. имеется несколько таблиц и один XML-файл. Чему соответствуют товары из группы <Group NAME="TELEFON"> и записям какой таблицы соответствует сама группа?

  Ответить  
 
 автор: *m*   (02.10.2009 в 22:30)   письмо автору
 
   для: cheops   (02.10.2009 в 19:41)
 

сложность заключаеться для меня в том, что я ранее так тесно с парсерами не сталкивался, а в моем данном случае, еще и нужно добавить данные не в одну таблицу а в четыре, что опять же таки для меня ново, я раньше только простые запросы к БД использовал. Хотя может и не так все сложно как я думаю..

первый пост:
----------------------------------------------------------------------------------------------------------------------------------------
Всем доброго времени суток!

Столкнулся с задачей, которую не знаю как решить.

Есть xml файл, его нужно импортировать в БД. Структура xml файла и БД в прикрепленном файле.

Делаю так:

<?
function startElement($parser$name$attrs) {
global 
$depth;

echo 
str_repeat("&nbsp;"$depth 3); 
echo 
"<b>Element: $name</b><br>"

$depth++; 

foreach (
$attrs as $attr => $value) {
echo 
str_repeat("&nbsp;"$depth 3); 

echo 
'Attribute: '.$attr.' = '.$value.'<br>';
}
}

function 
endElement($parser$name) {
global 
$depth;

$depth--; 
}

$depth 0;
$file "primer.xml";

$xml_parser xml_parser_create();

xml_set_element_handler($xml_parser"startElement""endElement");

if (!(
$fp fopen($file"r"))) {
die(
"could not open XML input");
}

while (
$data fgets($fp)) {
if (!
xml_parse($xml_parser$datafeof($fp))) {
echo 
"<br>XML Error: ";
echo 
xml_error_string(xml_get_error_code($xml_parser));
echo 
" at line ".xml_get_current_line_number($xml_parser);
break;
}
}

xml_parser_free($xml_parser);
?>


Все отлично парситься. Но я не знаю, что мне делать с эти массивом информации, мне нужно его записать в БД.

Очень прошу помочь в решении данного вопроса. Спасибо.
(p.s структура xml может быть изменена, под таблицы БД.)
-----------------------------------------------------------------------------------------------------------------------------------------
может быть я в принципе разбор как-то не так делаю..?
я могу привести описание таблиц, если нужно..

  Ответить  
 
 автор: cheops   (02.10.2009 в 19:41)   письмо автору
 
   для: *m*   (02.10.2009 в 13:27)
 

А в чем заключается сложность?

  Ответить  
 
 автор: *m*   (02.10.2009 в 13:27)   письмо автору
4 Кб
 
 

правка сообщения..

  Ответить  

Сообщения:  [1-10] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования