|
|
|
|
|
для: *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, $data, feof($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>';
*/
?>
|
| |
|
|
|
|
 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,$data, feof($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 '';
?>
|
но вот как записать получившийся массив в четыре таблицы в цикле?
при этом нужно чтоб скрипт проверял существует ли такая категоия, если нет, соответственно ее создавал и дальше рекурсивно проходил по ней записывая в нее товар..
или как-то разбить на два скрипта, один будет проходить корень, а второй делать рекурсию..
пожалуйста, помогите, решить данный вопрос.. | |
|
|
|
|
|
|
|
для: cheops
(05.10.2009 в 23:10)
| | ок, буду ждать, я думаю врятли.. | |
|
|
|
|
|
|
|
для: *m*
(05.10.2009 в 17:49)
| | Отпишусь чуть позже, если никто не опередит. | |
|
|
|
|
|
|
|
для: cheops
(02.10.2009 в 23:13)
| | 1 | |
|
|
|
|
 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опрос очень насущный..и не терпит отлагательств, я поэтому, вобщем уже и обратился на форум. Спасибо.) | |
|
|
|
|
|
|
|
для: *m*
(02.10.2009 в 22:30)
| | Что заполняем, какие таблицы? Т.е. имеется несколько таблиц и один XML-файл. Чему соответствуют товары из группы <Group NAME="TELEFON"> и записям какой таблицы соответствует сама группа? | |
|
|
|
|
|
|
|
для: cheops
(02.10.2009 в 19:41)
| | сложность заключаеться для меня в том, что я ранее так тесно с парсерами не сталкивался, а в моем данном случае, еще и нужно добавить данные не в одну таблицу а в четыре, что опять же таки для меня ново, я раньше только простые запросы к БД использовал. Хотя может и не так все сложно как я думаю..
первый пост:
----------------------------------------------------------------------------------------------------------------------------------------
Всем доброго времени суток!
Столкнулся с задачей, которую не знаю как решить.
Есть xml файл, его нужно импортировать в БД. Структура xml файла и БД в прикрепленном файле.
Делаю так:
<?
function startElement($parser, $name, $attrs) {
global $depth;
echo str_repeat(" ", $depth * 3);
echo "<b>Element: $name</b><br>";
$depth++;
foreach ($attrs as $attr => $value) {
echo str_repeat(" ", $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, $data, feof($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 может быть изменена, под таблицы БД.)
-----------------------------------------------------------------------------------------------------------------------------------------
может быть я в принципе разбор как-то не так делаю..?
я могу привести описание таблиц, если нужно.. | |
|
|
|
|
|
|
|
для: *m*
(02.10.2009 в 13:27)
| | А в чем заключается сложность? | |
|
|
|
|
 4 Кб |
|
| правка сообщения.. | |
|
|
| |
|