PHP-Script.hu
Kiemelt hirdetés:
2026. október 17. 09:35 szombat, ma Hedvig névnap van


grafika


Videóbázis


Listázás:  Idő szerint:
Webprogramozás arr PHP info php xml feldolgozás
(#5) tibig válasza erre: (#4) Gabor 2013.01.09. 07:54

tibig
tibig
Kezdő

Szia Gábor!
Köszönöm a gyors segítséget.
Az általad leírtak alapján simán megoldottam a feladatot, és nem utolsó sorban igen értékes információkhoz jutottam.
Köszönöm mégegyszer.
Szép napot.

(#4) Gabor válasza erre: (#1) tibig 2013.01.08. 12:20

Gabor
Gabor
Szerkesztő

Szervusz tibiq!
Úgy gondolom két féle képpen is lehet értelmezni a problémádat. De mielőtt elmondom mire gondolok bevezetek néhány dolgot, hogy példálózhassak. Először is nem mondtad hogyan néz ki egy xml fájlod ezért most én ide firkantok valamit, és ezen fogom bemutatni a dolgokat.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<!-- Példa xml amit a raktár küld -->
<keszlet>
<!-- a keszlet a root -->
  <raktar name="Gödöllői raktár">
    <item name="fakocka" dbid="765483">
      <amount arrives="2013-01-12">120</amount>
      <amount arrives="2013-01-20">60</amount>
      <amount arrives="2013-02-02">100</amount>
    </item>
    <!-- stb... -->
  </raktar>
</keszlet>
 


Na tehát tegyük fel hogy ilyen. Ha most az lenne a problémád hogy ezt a nyilvántartó "gyárilag több xml fájlba darabolja" vagyis több szabályos xml fájlt készít belőle. Mondjuk minden raktárnak egyet. Akkor semmi baj nem lenne hiszen sorban feldolgoznád mindet és beírnád az adatbázisba. Gondolom a probléma az, hogy nem több xml fájlt készít, hanem egyet, viszont azt darabokban küldi el pl.:

1
2
3
4
5
6
7
8
 
<!-- Példa xml amit a raktár küld -->
<keszlet>
<!-- a keszlet a root -->
  <raktar name="Gödöllői raktár">
    <item name="fakocka" dbid="765483">
      <amount arrives="2013-01-12">120</amount>
 

1
2
3
4
5
6
7
8
 
      <amount arrives="2013-01-20">60</amount>
      <amount arrives="2013-02-02">100</amount>
    </item>
    <!-- stb... -->
  </raktar>
</keszlet>
 

Ezek viszont így nem dolgozhatóak fel külön. Azért gondolom hogy ez lehet a baj, mert máskülönben megbírkóznál vele. Ahhoz, hogy értelmes megoldást adjak jó lett volna még néhány részlet. Van-e adatbázisod amit használhatsz hogy a darabokat tárold, vagy inkább írnád őket fájlba? Pontosan hogyan küldi a rendszer az adatokat? Így csak annyit tudok
1. A beérkező fájl darabokat tárolni kell [fájlban, vagy adatbázisban egyik sem bonyolult]
2. Kell valami azonosító hogy a darab melyik xml fájlhoz tartozik, és hogy annak hanyadik darabja. Ha ilyeneket a rendszer nem küld akkor feltételezhetjük hogy egyszerre csak egy nyilvántartó program fut, és az egy xml fájlt küld mégpedig a darabokat sorrendben
3. Le kell ellenőrizni hogy egy darab az utólsó-e [pl. megvizsgálod hogy a végén ott van -e a gyökér elem lezáró párja. a példában ez a </keszlet>]
4. Ha ez az utólsó akkor a jó sorrendben összefűzöd őket [vagy ha pl egy fájlba írtad akkor ez már meg is van]
5. Kész innen már csak fel kell dolgozni.
Konkrét megvalósítást a specifikáció nélkül nem tudok, de azért egy példát hozok rá. Ebben feltételezek néhány dolgot. Az xml fájl ahogy írtad post kérésként érkezik. Mégpedig a rawxml indexen található az xml fájl aktuális darabja. Ha a rendszer küld azonosítót, hogy melyik fájlhoz tartozik a darab akkor azt a xmlname néven teszi. Ha a rendszer küld egy azonosítót hogy ez hanyadik darab, akkor azt a chunk indexen közli.

Ahhoz hogy működjön szükség lesz egy mysql adatbázisra ezzel a táblával:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
--
-- Tábla szerkezet: `xmlchunks`
--
 
CREATE TABLE IF NOT EXISTS `xmlchunks` (
  `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'kulcs',
  `raw` text NOT NULL COMMENT 'chunk data',
  `stream` VARCHAR(255) NOT NULL COMMENT 'xml file',
  `number` tinyint(3) UNSIGNED NOT NULL COMMENT 'hanyadik darab',
  `created` datetime NOT NULL COMMENT 'rekord létrehozva',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 


Aztán itt a script. Természetesen ha nincs adatbázis akkor is megoldható a dolog, de így elegánsabb.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
 
<?php
//xml adatok feldolgozásához
 
//-- 
//-- 1. A beérkező adatok tárolása
//-- 
 
/* Adatbázist használunk */
$host = "localhost";
$user = "user";
$pass = "pwdpwd";
$db   = "teszt";
 
/* Adatbázis megnyitása */
$con = new mysqli($host, $user, $pass, $db);
 
/* Az aktuális darab tárolása */
$raw = $con->escape_string(trim($_POST['rawxml']));
$stream = (isset($_POST['xmlname']))?                    /*ha adott hogy melyik xml fájlhoz tartozik a darab*/ 
            $con->escape_string(trim($_POST['xmlname'])):/*akkor ahhoz*/
            'default';                                   /*egyébként a defaulthoz*/
$num = (isset($_POST['chunk']) && is_numeric($_POST['chunk']))? /* ha meg van adva a sorszám */
            intval($_POST['chunk']):
            0;
 
if(!$con->query("INSERT INTO `xmlchunks` (`raw`, `stream`, `number`, `created`) VALUES ('$raw', '$stream', '$num', NOW());")) {
    echo 'Hiba történt: ('.$con->errno.') '.$con->error;
    exit();
}
 
//DEBUG
echo "<!-- Adatok sikeresen importalva -->\n";
 
//--
//-- 2. Ez az utólsó darab?
//--
$root_element = "keszlet";
 
if(stripos($_POST['rawxml'], '</'.$root_element.'>') === FALSE) {
    /* Ez nem az utolsó darab úgyhogy befejeztük */
    exit();
}
 
//--
//-- 3. Összefűzés
//--
 
$result = $con->query("SELECT `raw` FROM `xmlchunks` WHERE strcmp(`stream`,'$stream') = 0 ORDER BY `number` ASC, `created` ASC;");
$xml = '';
if($result) {
    /* eredmény feldolgozása */
    while($row = $result->fetch_row()) {
        $xml .= $row[0]; /* hozzáfűzzük az adott darabot */
    }
    
    /* free result set */
    $result->free();
}
 
/* stream kiürítése */
/* azért szükséges mert ha például a nyilvántartás.xml
 * fájlba érkeznek adatok 17 darabban és nem töröljük őket a végén
 * legközelebb érkezik mondjuk 10 darab, akkor ahhoz hozzáfogjuk
 * fűzni az előző 17-et is és ez nem lenne jó
 */
$con->query("DELETE FROM `xmlchunks` WHERE strcmp(`stream`,'$stream') = 0;");
 
//--
//-- 4. Feldolgozás
//--
 
/* csak demo */
echo "<!-- adatok feldolgozasa (demo: print) -->";
echo htmlentities($xml);
 
?>
 


Egy teszt űrlappal ki is próbáltam, remekül működik.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<html>
<head>
<title>Űrlap az xml feldolgozóhoz</title>
</head>
<body>
<form method="POST" action="xmlparser.php">
    <label for="__xmlname">XML fájl: </label><input type="text" name="xmlname" id="__xmlname" /><br />
    <label for="__rawxml">Tartalom: </label><textarea rows="10" cols="50" name="rawxml" id="__rawxml"></textarea><br />
    <label for="__chunk">Sorszám: </label><input type="text" name="chunk" id="__chunk" /><br />
    <input type="submit" value="Elküld" /><br />
</form>
</body>
</html>
 


Sok sikert, szép napot! :)

(#3) tibig válasza erre: (#2) raczger 2013.01.08. 11:01

tibig
tibig
Kezdő

Köszönöm a segítséget.

(#2) raczger válasza erre: (#1) tibig 2013.01.08. 08:53

raczger
raczger
Admin

Ezen az oldalon van egy kezdő példakód, ebből már el tudsz indulni, hogyan is kellene beolvasni az xml fájlt.

(#1) tibig 2013.01.07. 19:51

tibig
tibig
Kezdő

Sziasztok!
Kezdő php-s vagyok, és az xml fájlok feldolgozásával gyűlt meg a bajom. Adott egy készletnyilvántartó program és egy webshop. A webshop felé szeretnék szinkronizálni termékeket. A készlet nyilvántartó xml fájlba küldi az adatokat, azokat a webshopban a $_POST('akármi') függvénnyel nyerem ki. Egy xml fájl-t simán fel tudok dolgozni, csakhogy, a készletnyilvántartó gyárilag több fájl-ra darabolja az adatokat és automatikusan küld egymás után 5-10 xml fájl-t.
Ahhoz kérnék segítséget, hogy milyen módszerrel lehet az így küldött fájlokat feldolgozni.
Köszönöm.

Listázás:  Idő szerint:


© 2006-2026 PHP-Script.hu, Minden jog fenntartva!
Design: Rácz Gergely, Oldalmotor: Rácz Gergely
Impresszum - Oldaltörténet - Oldalszabályzat