source: pmb4.2/trunk/fuentes/pmb/admin/convert/xml_unimarc.class.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 12.2 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: xml_unimarc.class.php,v 1.25 2013-04-17 08:37:34 mbertin Exp $
6
7//Classe de conversion unimarc/xml ou xml/unimarc
8
9if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
10
11require_once("$base_path/classes/iso2709.class.php");
12
13class xml_unimarc {
14
15        var $n_traitees;                //Nombre de notices traitées
16        var $n_valid;                   //Nombre de notices valides
17        var $n_invalid;                 //Nombre de notices invalides
18
19        var $fpw;                               //Pointeur du fichier
20        var $n;                                 //Notice en cours
21        var $field;                             //Champ en cours de traitement
22        var $field_ind;                 //Indicateur du champ en cours de traitement
23        var $sub_field_array;   //Tableau des sous champs
24        var $s_field;                   //Sous champ en cours de traitement
25        var $new_field;                 //Le champ en cours vient-il d'être créé
26        var $new_subfield;              //Le sous champ en cours vient-il d'être créé
27        var $special;                   //Champ spécial d'amorçage de la notice
28        var $n_;                                //$n_=1 : Le début de traitement des notices à commencé
29        var $field_value;               //Valeur du champ en cours
30        var $notices_;                  //Tableau de notices converties du XML
31        var $notices_xml_;              //Tableau de notices XML converties du iso
32        var $error_msg;
33        var $warning_msg;
34        var $current_encoding;
35        var $is_utf8=false;
36       
37    function xml_unimarc() {
38        $this->n_traitees=0;
39                $this->n_valid=0;
40                $this->n_invalid=0;
41    }
42   
43    function iso2709toXML($fileIn,$fileOut) {
44        global $charset;
45        $fp = @fopen($fileIn, "r");
46        if (!$fp) return 0;
47                $contents = fread($fp, filesize($fileIn));
48                fclose($fp);
49
50                $fp = @fopen($fileOut, "w+");
51                if (!$fp) return 0;
52
53                fwrite($fp, "<?xml version=\"1.0\" encoding=\"$charset\" ?>\n");
54
55                fwrite($fp, "<unimarc>\n");
56                $n_notices=0;
57                $n_valid=0;
58                $n_invalid=0;
59               
60                $this->n_traitees=0;
61                $this->n_valid=0;
62                $this->n_invalid=0;
63               
64                while ($contents != "") {
65                        $e_notice = strpos($contents, chr(0x1d));
66
67                        $notice = substr($contents, 0, $e_notice +1);
68                        $contents = substr($contents, $e_notice +1);
69                        $n = new iso2709_record($notice);
70
71                        if ($n->valid()) {
72                                //Récupération des infos
73
74                                //Taille code sous-champ
75                                $sl = $n -> inner_guide["sl"];
76                                //Taille des inticateurs
77                                $il = $n -> inner_guide["il"];
78
79                                fwrite($fp, "  <notice>\n");
80
81                                //Etat de la notice
82                                $values = array("rs", "dt", "bl", "hl", "el", "ru");
83                                for ($i = 0; $i < count($values); $i ++) {
84                                        $v=$n -> inner_guide[$values[$i]];
85                                        if (ord($v)==32) $v="*";
86                                        fwrite($fp, "    <".$values[$i].">".$v."</".$values[$i].">\n");
87                                }
88
89                                for ($i = 0; $i < count($n -> inner_data); $i ++) {
90                                        fwrite($fp, "    <f c=\"".$n -> inner_data[$i]["label"]."\"");
91                                        $content = substr($n -> inner_data[$i]["content"], 0, strlen($n -> inner_data[$i]["content"]) - 1);
92                                        $sub_fields = explode(chr(31), $content);
93                                        if (count($sub_fields) == 1) {
94                                                fwrite($fp, ">".htmlspecialchars($n -> ISO_decode($sub_fields[0]),ENT_QUOTES,$charset)."</f>\n");
95                                        } else {
96                                                if (strlen($sub_fields[0])>2) {
97                                                        $sub_fields[0]=substr($sub_fields[0],strlen($sub_fields[0])-2);
98                                                }
99                                                fwrite($fp, " ind=\"".$sub_fields[0]."\">\n");
100                                                for ($j = 1; $j < count($sub_fields); $j ++) {
101                                                        fwrite($fp, "      <s c=\"".substr($sub_fields[$j], 0, 1)."\">".htmlspecialchars($n -> ISO_decode(substr($sub_fields[$j], 1)),ENT_QUOTES,$charset)."</s>\n");
102                                                }
103                                                fwrite($fp, "    </f>\n");
104                                        }
105                                }
106                                fwrite($fp, "  </notice>\n");
107                                $n_valid++;
108                        } else {
109                                $n_invalid++;
110                        }
111                        $n_notices++;
112                }
113                fwrite($fp, "</unimarc>\n");
114                fclose($fp);
115               
116                $this->n_traitees=$n_notices;
117                $this->n_valid=$n_valid;
118                $this->n_invalid=$n_invalid;
119                return $n_notices;
120    }
121
122        function iso2709toXML_notice($contents,$format="unimarc") {
123                global $output_params,$charset;
124               
125                $n_notices=0;
126                $n_valid=0;
127                $n_invalid=0;
128               
129                $this->n_traitees=0;
130                $this->n_valid=0;
131                $this->n_invalid=0;
132                $this->error_msg=array();
133                $this->warning_msg=array();
134                $this->notices_xml_=array();
135               
136                while ($contents != "") {
137                        $e_notice = strpos($contents, chr(0x1d));
138
139                        $notice = substr($contents, 0, $e_notice +1);
140                        $contents = substr($contents, $e_notice +1);
141                        $n = new iso2709_record($notice,AUTO_UPDATE,$format);
142                        if ($n->is_utf8) {
143                                $this->is_utf8=true;
144                        }else{
145                                if ($output_params['CHARSET'] == "utf-8"){
146                                        $n->inner_guide['pos9']="a";
147                                }
148                        }
149                        if ($n->valid()) {
150                                //Récupération des infos
151
152                                //Taille code sous-champ
153                                $sl = $n -> inner_guide["sl"];
154                                //Taille des inticateurs
155                                $il = $n -> inner_guide["il"];
156
157                                $data.="  <notice>\n";
158
159                                //Etat de la notice
160                                $values = array("rs", "dt", "bl", "hl", "el", "ru");
161                                for ($i = 0; $i < count($values); $i ++) {
162                                        $v=$n->inner_guide[$values[$i]];
163                                        if (ord($v)==32) $v="*";
164                                        $data.="    <".$values[$i].">".$v."</".$values[$i].">\n";
165                                }
166
167                                for ($i = 0; $i < count($n->inner_data); $i ++) {
168                                        $data.="    <f c=\"".$n->inner_data[$i]["label"]."\"";
169                                        $content = substr($n -> inner_data[$i]["content"], 0, strlen($n -> inner_data[$i]["content"]) - 1);
170                                        $sub_fields = explode(chr(31), $content);
171                                        if (count($sub_fields) == 1) {
172                                                $data.=">".htmlspecialchars($this->is_utf8?$sub_fields[0]:$n->ISO_decode($sub_fields[0]),ENT_QUOTES,$charset)."</f>\n";
173                                        } else {
174                                                if (strlen($sub_fields[0])>2) {
175                                                        $sub_fields[0]=substr($sub_fields[0],strlen($sub_fields[0])-2);
176                                                }
177                                                $data.=" ind=\"".$sub_fields[0]."\">\n";
178                                                for ($j = 1; $j < count($sub_fields); $j ++) {
179                                                        $data.="      <s c=\"".substr($sub_fields[$j], 0, 1)."\">".htmlspecialchars($this->is_utf8?substr($sub_fields[$j], 1):$n->ISO_decode(substr($sub_fields[$j], 1)),ENT_QUOTES,$charset)."</s>\n";
180                                                }
181                                                $data.="    </f>\n";
182                                        }
183                                }
184                                $data.="  </notice>\n";
185                                $this->notices_xml_[]=$data;
186                                $n_valid++;
187                        } else {
188                                $this->error_msg[]=@implode(" / ",$n->errors);
189                                $n_invalid++;
190                        }
191                        $n_notices++;
192                }
193               
194                $this->n_traitees=$n_notices;
195                $this->n_valid=$n_valid;
196                $this->n_invalid=$n_invalid;
197                return $n_notices;
198    }
199
200        function startElement($parser, $name, $attrs) {
201                switch ($name) {
202                        case "NOTICE":
203                                $this->n=new iso2709_record('',0);
204                                if($this->current_encoding == "UTF-8") $this->n->is_utf8 = true;
205                                $this->n_=1;
206                        break;
207                        case "F":
208                                $this->field=$attrs["C"];
209                                $this->field_ind=$attrs["IND"];
210                                $this->sub_field_array=array();
211                                $this->field_value="";
212                                $this->new_field=true;
213                        break;
214                        case "S":
215                                $this->s_field=$attrs["C"];
216                                $this->new_subfield=true;
217                        break;
218                        default:
219                                if ($this->n_) $this->special=$name;
220                        break;
221                }
222        }
223   
224    function endElement($parser, $name) {
225                switch ($name) {
226                        case "NOTICE":
227                                $this->n->update();
228                                if(count($this->n->warnings)){
229                                        $this->warning_msg[]=@implode(" / ",$this->n->warnings);
230                                }
231                                if ($this->n->valid()) {
232                                        fwrite($this->fpw,$this->n->full_record);
233                                        $this->n_valid++;
234                                } else {
235                                        $this->error_msg[]=@implode(" / ",$this->n->errors);
236                                        $this->n_invalid++;
237                                }
238                                $this->n_traitees++;
239                                $this->n_="";
240                        break;
241                        case "F":
242                                if (count($this->sub_field_array)) $this->n->add_field($this->field,$this->field_ind,$this->sub_field_array); else $this->n->add_field($this->field,'',$this->field_value);
243                                $this->field="";
244                                $this->field_ind="";
245                        break;
246                        case "S":
247                                $this->s_field="";
248                        break;
249                        default:
250                                if ($this->n_) $this->special="";
251                        break;
252                }
253        }
254
255        function characterData($parser,$data) {
256                //$data=trim($data);
257                if ($data=="") return;
258               
259                //Si l'on est dans une notice
260                if ($this->n_) {
261                        if ($this->special) {
262                                if ($data=="*") $data=" ";
263                                switch(strtolower($this->special)) {
264                                        case "rs" :
265                                                $this->n->set_rs($data);
266                                                break;
267                                        case "dt" :
268                                                $this->n->set_dt($data);
269                                                break;
270                                        case "bl" :
271                                                $this->n->set_bl($data);
272                                                break;
273                                        case "hl" :
274                                                $this->n->set_hl($data);
275                                                break;
276                                        case "el" :
277                                                $this->n->set_el($data);
278                                                break;
279                                        case "ru" :
280                                                $this->n->set_ru($data);
281                                                break;
282                                        default:
283                                                $this->error_msg[] = "Le guide (".$this->special.") de la notice est inconnu !!";
284                                                $this->n->errors ="x";
285                                                $this->n_invalid++;
286                                }
287                                return;
288                        }
289                        if ($this->s_field!=="") {
290                                //Gestion des entités
291                                if ($this->new_subfield) {
292                                        $t=array();
293                                        $t[0]=$this->s_field;
294                                        $t[1]=$data;
295                                        $this->sub_field_array[]=$t;
296                                        $this->new_subfield=false;
297                                        return;
298                                } else {
299                                        $this->sub_field_array[count($this->sub_field_array)-1][1].=$data;
300                                        return;
301                                }
302                        }
303                        if ($this->field) {
304                                //Gestion des entités
305                                if ($this->new_field) {
306                                        $this->field_value=$data;
307                                        $this->new_field=false;
308                                } else $this->field_value.=$data;
309                        }
310                }
311        }
312
313       
314    function XMLtoiso2709($fileIn,$fileOut) {
315        global $charset;
316        $this->fpw=fopen($fileOut,"w+");
317        if (!$this->fpw) return 0;
318
319                $this->n_traitees=0;
320                $this->n_valid=0;
321                $this->n_invalid=0;
322                $this->field="";
323                $this->s_field="";
324                $this->n="";
325                $this->n_="";
326                $this->sub_field_array=array();
327               
328                if (!($fp = fopen($fileIn, "r"))) {
329                    return 0;
330                }
331
332                $file_size=filesize ($fileIn);
333                $data = fread ($fp, $file_size);
334               
335                $rx = "/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
336                if (preg_match($rx, $data, $m)) $encoding = strtoupper($m[1]);
337                        else $encoding = "ISO-8859-1";
338               
339                $xml_parser = xml_parser_create($encoding);
340                xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, $charset);               
341                xml_set_object($xml_parser, $this);
342                xml_set_element_handler($xml_parser, "startElement", "endElement");
343                xml_set_character_data_handler($xml_parser, "characterData");
344
345
346                while ($data = fread($fp, 4096)) {
347                    if (!xml_parse($xml_parser, $data, feof($fp))) {
348                     $this->error_msg[]=sprintf("XML error: %s at line %d, column %d",
349             xml_error_string(xml_get_error_code($xml_parser)),
350             xml_get_current_line_number($xml_parser), xml_get_current_column_number($xml_parser));
351             return 0;
352                        }
353                }
354                xml_parser_free($xml_parser);
355
356                fclose($this->fpw);
357                return $this->n_traitees;
358    }
359   
360    function endElement_notice($parser, $name) {
361                switch ($name) {
362                        case "NOTICE":
363                                $this->n->update();
364                                if(count($this->n->warnings)){
365                                        $this->warning_msg[]=@implode(" / ",$this->n->warnings);
366                                }
367                                if ($this->n->valid()) {
368                                        $this->notices_[]=$this->n->full_record;
369                                        $this->n_valid++;
370                                } else {
371                                        $this->error_msg[]=@implode(" / ",$this->n->errors);
372                                        $this->n_invalid++;
373                                }
374                                $this->n_traitees++;
375                                $this->n_="";
376                        break;
377                        case "F":
378                                if (count($this->sub_field_array)) $this->n->add_field($this->field,$this->field_ind,$this->sub_field_array); else $this->n->add_field($this->field,'',$this->field_value);
379                                $this->field="";
380                                $this->field_ind="";
381                        break;
382                        case "S":
383                                $this->s_field="";
384                        break;
385                        default:
386                                if ($this->n_) $this->special="";
387                        break;
388                }
389        }
390   
391    function XMLtoiso2709_notice($notice,$encoding) {
392        global $charset;
393                $this->n_traitees=0;
394                $this->n_valid=0;
395                $this->n_invalid=0;
396                $this->field="";
397                $this->s_field="";
398                $this->n="";
399                $this->n_="";
400                $this->sub_field_array=array();
401               
402                $this->notices_=array();
403                $this->error_msg=array();
404               
405                if (strpos($notice,"<?xml")===false) {
406                        if (!$encoding) $encoding = $charset;
407                        $notice="<?xml version='1.0' encoding='".$encoding."' ?>\n".$notice;
408                }
409               
410                $rx = "/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
411                if (preg_match($rx, $notice, $m)) $encoding = strtoupper($m[1]);
412                else if (!$encoding) $encoding =$charset;       
413                $this->current_encoding = $encoding;
414               
415                $xml_parser = xml_parser_create($this->current_encoding);
416                xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, $this->current_encoding);               
417                xml_set_object($xml_parser, $this);
418                xml_set_element_handler($xml_parser, "startElement", "endElement_notice");
419                xml_set_character_data_handler($xml_parser, "characterData");
420            if (!xml_parse($xml_parser, $notice, 1)) {
421                $this->error_msg[]=sprintf("XML error: %s at line %d, colomn %d -- $notice",
422             xml_error_string(xml_get_error_code($xml_parser)),
423             xml_get_current_line_number($xml_parser), xml_get_current_column_number($xml_parser));
424                     return 0;
425                }
426                xml_parser_free($xml_parser);
427
428                return $this->n_traitees;
429    }
430}
431?>
Note: See TracBrowser for help on using the repository browser.