
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! :)
|