source: 1dwg/trunk/php/xmlWriter/index.php @ 72

Last change on this file since 72 was 72, checked in by prjemian, 12 years ago

upload the code to format XML from simple WWW form boxes
For now, copy/paste 3-column ASCII Q, I, Idev and some basic info and the form will respond with cansas1d/1.0 XML with all required elements. Use as a starting point.

  • Property svn:keywords set to Date Revision Author HeadURL Id
File size: 11.9 KB
Line 
1<?php
2
3########### SVN repository information ###################
4# $Date$
5# $Author$
6# $Revision$
7# $URL$
8# $Id$
9########### SVN repository information ###################
10
11
12$tool['titleStr'] = "canSAS1d/1.0 XML formatter";
13$tool['svnid'] = "\$Id$";
14$tool['email'] = "jemian@anl.gov";
15$tool['postMethod'] = 'POST';
16$tool['postAction'] = 'index.php';
17$tool['surveillance_file'] = './www/surveillance.xml';  // chmod 666
18$tool['meta,desc'] = "Formats SAS data in the cansas1d/1.0 XML data format.";
19$tool['meta,keys'] = "small-angle scattering, data format";
20$tool['canSAS_URL'] = "http://www.smallangles.net/"
21        . "wgwiki/index.php/cansas1d_documentation";
22
23# here are the form variables and descriptions
24$vars['title'] = 'Title';
25$vars['run'] = 'Run';
26$vars['sample_id'] = 'Sample ID';
27$vars['sample_thickness'] = 'thickness (mm)';
28$vars['sample_details'] = 'other sample details';
29$vars['instrument_name'] = 'SAS instrument name';
30$vars['instrument_radiation'] = '"neutron" or "xray"';
31$vars['instrument_wavelength'] = 'Wavelength (A)';
32$vars['detector_name'] = 'Detector name';
33$vars['detector_SDD'] = 'sample-detector distance (m)';
34$vars['SASnote'] = 'SASnote';
35$vars['SASdata'] = 'SAS data (3 columns: Q I Idev)';
36
37
38$process = 0;           // Should processing be run this time?
39$post = array();    // processing parameters to be used
40
41# look for any input parameters
42switch ($_SERVER["REQUEST_METHOD"]) {
43        case "":  # command-line processing
44                #$usage = 'usage: php ';
45                #$usage .= $_SERVER['SCRIPT_FILENAME'];
46                #$usage .= ' [undefined now]';
47                exit("command line not supported now");
48                break;
49        case "GET":
50                break;
51        case "POST":
52                $process = 1;
53                foreach ($_REQUEST as $key => $value) {
54                        $post[$key] = $value;
55                }
56                break;
57}
58
59try {
60   surveillance($post); # make a log entry
61} catch (Exception $e) {}
62
63# process the request
64if ($process == 1) {
65        $result = prepare_cansasxml($post);
66}
67
68switch ($_SERVER["REQUEST_METHOD"]) {
69        case "GET":
70                $page = buildHtmlPage($post);
71                print($page);
72                break;
73        case "POST":  # this is when the work gets done
74                header("Content-Type: text/xml");
75                print($result);
76                break;
77        case "":  # command-line interface works here
78                print("No command-line interface at this time.");
79                break;
80}
81#phpInfo();
82
83
84function buildHtmlPage($post) {
85        global $tool;
86        global $vars;
87
88        $doc = new DOMDocument('1.0', 'UTF-8');
89
90        $root = addElement($doc, $doc, 'html');
91        addComment($doc, $root, $tool['titleStr']);
92
93        #--start-header------------------------------------
94        $head = addElement($doc, $root, 'head');
95        addTextElement($doc, $head, 'title', $tool['titleStr']);
96        $node = addElement($doc, $head, 'meta');
97        addAttribute($node, 'http-equiv', 'Content-Type');
98        addAttribute($node, 'content', 'text/html;charset=iso-8859-1');
99
100        $node = addElement($doc, $head, 'meta');
101        addAttribute($node, 'name', 'description');
102        addAttribute($node, 'content', $tool['meta,desc']);
103
104        $node = addElement($doc, $head, 'meta');
105        addAttribute($node, 'name', 'keywords');
106        addAttribute($node, 'content', $tool['meta,keys']);
107        #--end-header------------------------------------
108
109        #--start-body------------------------------------
110        $body = addElement($doc, $root, 'body');
111        addTextElement($doc, $body, 'h1', $tool['titleStr']);
112
113        #--start-form------------------------------------
114        addComment($doc, $body, ' start form ');
115        $form = addElement($doc, $body, 'form');
116        addAttribute($form, 'method', $tool['postMethod']);
117        addAttribute($form, 'action', $tool['postAction']);
118
119        addComment($doc, $form, ' start form table ');
120        $table = addElement($doc, $form, 'table');
121        addAttribute($table, 'border', '2');
122        foreach ($vars as $index => $value) {
123                $tr = addElement($doc, $table, 'tr');
124                addTextElement($doc, $tr, 'td', $value);
125                $td = addElement($doc, $tr, 'td');
126                $input = addElement($doc, $td, 'input');
127                addAttribute($input, 'type', 'text');
128                addAttribute($input, 'size', '50');
129                addAttribute($input, 'name', $index);
130                addAttribute($input, 'value', $post[$index]);
131        }
132        addComment($doc, $form, ' end form table ');
133
134        addComment($doc, $form, ' start form buttons ');
135        foreach (array("Submit", "Reset") as $item) {
136                $input = addElement($doc, $form, 'input');
137                addAttribute($input, 'type', strtolower($item));
138                addAttribute($input, 'value', $item);
139        }
140        addComment($doc, $form, ' end form buttons ');
141
142        addComment($doc, $body, ' end form ');
143        #--end-form------------------------------------
144
145        #--start-content------------------------------------
146        addElement($doc, $body, 'hr');
147        addComment($doc, $body, ' start content ');
148
149        addTextElement($doc, $body, 'h2', 'Overview');
150        $p = addElement($doc, $body, 'p');
151        addText($doc, $p, 
152                'This WWW form provides a means to convert ' .
153                'one dimensional small-angle scattering data into ' .
154                'the XML format described by the '
155        );
156        $a = addElement($doc, $p, 'a');
157        addAttribute($a, 'href', $tool['canSAS_URL']);
158        addText($doc, $a, 'cansas1d/1.0 standard');
159        addText($doc, $p, 
160                '.  The WWW form returns the data in the XML format.'
161        );
162        addTextElement($doc, $body, 'h2', 'Hints');
163        $p = addElement($doc, $body, 'p');
164        addText($doc, $p, 
165                'The SASdata, delimited by white-space and/or commas, ' .
166                'will be parsed in triples of '
167        );
168        addTextElement($doc, $p, 'tt', 'Q I Idev');
169        addText($doc, $p, 
170                '.  It is ' .
171                'possible to copy/paste from a 3-column text file directly ' .
172                'into the SASdata entry box.'
173        );
174        addTextElement($doc, $body, 'h2', 'Results');
175        $p = addElement($doc, $body, 'p');
176        addText($doc, $p, 
177                'Output from the form will be formatted for nice display ' .
178                'using the standard canSAS style sheet.  To see the raw ' .
179                'XML output, use the "View Source" capability of your browser.'
180        );
181
182        addComment($doc, $body, ' end content ');
183        #--end-content------------------------------------
184
185        #--start-footer------------------------------------
186        addElement($doc, $body, 'hr');
187        addComment($doc, $body, ' start footer ');
188
189        $small = addElement($doc, $body, 'small');
190        addText($doc, $small, 'For information about this page, contact ');
191
192        $node = addElement($doc, $small, 'a');
193        addAttribute($node, 'href', 'mailto:' . $tool['email']);
194        addText($doc, $node, $tool['email']);
195
196        addElement($doc, $body, 'br');
197
198        $small = addTextElement($doc, $body, 'small', $tool['svnid']);
199
200        addComment($doc, $body, ' end footer ');
201        #--end-footer------------------------------
202
203        #--end-body------------------------------------
204
205        #print($doc->saveXML());
206        return(prettyXML($doc->saveXML()));
207}
208
209
210function prepare_cansasxml($post) {
211        global $tool;
212
213        $doc = new DOMDocument('1.0', 'UTF-8');
214
215        $xslt = $doc->createProcessingInstruction('xml-stylesheet', 
216                'type="text/xsl" href="cansasxml-html.xsl"');
217        $doc->appendChild($xslt);
218
219        $root = $doc->createElementNS('cansas1d/1.0','SASroot');
220        $doc->appendChild($root);
221        addComment($doc, $root, 'canSAS XML created by ' . $tool['titleStr']);
222
223        $xsi_url = 'http://www.w3.org/2001/XMLSchema-instance';
224        $schemaLocation = 'cansas1d/1.0 '
225           . 'http://svn.smallangles.net/svn/canSAS/1dwg/trunk/cansas1d.xsd';
226        addAttribute($root, 'version', '1.0');
227        addAttribute($root, 'xmlns:xsi', $xsi_url);
228        addAttribute($root, 'xsi:schemaLocation', $schemaLocation);
229
230        $entry = addElement($doc, $root, 'SASentry');
231        addAttribute($entry, 'name', 'entry1');
232
233        addTextElement($doc, $entry, 'Title', $post['title']);
234        addTextElement($doc, $entry, 'Run', $post['run']);
235
236
237        $sasdata = addElement($doc, $entry, 'SASdata');
238        $data = preg_split("/[\s,]+/", trim($post['SASdata']));
239        $rows = count($data)/3;
240        for ($i = 0; $i < $rows; $i++) {
241          $idata = addElement($doc, $sasdata, 'Idata');
242          $node = addTextElement($doc, $idata, 'Q', $data[$i*3+0]);
243          addAttribute($node, 'unit', '1/A');
244          $node = addTextElement($doc, $idata, 'I', $data[$i*3+1]);
245          addAttribute($node, 'unit', '1/cm');
246          $node = addTextElement($doc, $idata, 'Idev', $data[$i*3+2]);
247          addAttribute($node, 'unit', '1/cm');
248        }
249
250
251        $sassample = addElement($doc, $entry, 'SASsample');
252        addTextElement($doc, $sassample, 'ID', $post['sample_id']);
253        $node = addTextElement($doc, $sassample, 'thickness', 
254                $post['sample_thickness']);
255        addAttribute($node, 'unit', 'mm');
256        # other nodes belong here
257        addTextElement($doc, $sassample, 'details', $post['sample_details']);
258
259        $sasinstrument = addElement($doc, $entry, 'SASinstrument');
260        addTextElement($doc, $sasinstrument, 'name', $post['instrument_name']);
261
262        $sassource = addElement($doc, $sasinstrument, 'SASsource');
263        addTextElement($doc, $sassource, 'radiation', 
264                $post['instrument_radiation']);
265        $node = addTextElement($doc, $sassource, 'wavelength', 
266                $post['instrument_wavelength']);
267        addAttribute($node, 'unit', 'A');
268
269        $sascollimation = addElement($doc, $sasinstrument, 
270                'SAScollimation');
271
272        $sasdetector = addElement($doc, $sasinstrument, 'SASdetector');
273        addTextElement($doc, $sasdetector, 'name', $post['detector_name']);
274
275        $node = addTextElement($doc, $sasdetector, 'SDD', $post['detector_SDD']);
276        addAttribute($node, 'unit', 'm');
277
278        $sasprocess = addElement($doc, $entry, 'SASprocess');
279        addTextElement($doc, $sasprocess, 'name', $tool['titleStr']);
280        addTextElement($doc, $sasprocess, 'date', PRJ_mysqlDate('now') );
281
282        $node = addTextElement($doc, $sasprocess, 'SASprocessnote', $tool['svnid']);
283        addAttribute($node, 'name', 'svnid');
284
285        $str = 'formatting of text data into canSAS XML 1D standard';
286        $node = addTextElement($doc, $sasprocess, 'SASprocessnote', $str);
287        addAttribute($node, 'name', 'titleStr');
288
289        $sasnote = addElement($doc, $entry, 'SASnote');
290
291        return(prettyXML($doc->saveXML()));
292}
293
294
295function surveillance($post) {
296        global $tool;
297        $tags = array(
298                'REMOTE_HOST', 'REMOTE_ADDR', 'REQUEST_URI',
299                'SCRIPT_FILENAME', 'REQUEST_METHOD',
300                'HTTP_USER_AGENT', 'REQUEST_TIME'
301        );
302        $date = date('Y-m-d');
303        $time = date('H:i:s');
304
305        $doc = new DomDocument();
306        $doc->Load($tool['surveillance_file']);
307        $root = $doc->getElementsByTagName('cansasxml')->item(0);
308
309        $entry = addElement($doc, $root, 'entry');
310        addAttribute($entry, 'date', $date);
311        addAttribute($entry, 'time', $time);
312
313        $list = addElement($doc, $entry, 'sas_variables');
314        foreach ($post as $key => $value) {
315                $node = addTextElement($doc, $list, 'var', $value);
316                addAttribute($node, 'name', $key);
317        }
318
319        $list = addElement($doc, $entry, 'server_variables');
320        foreach ($tags as $key) {
321                $node = addElement($doc, $list, 'var');
322                addAttribute($node, 'name', $key);
323                if (strlen($_SERVER[$key])>0) {
324                        addText($doc, $node, $_SERVER[$key]);
325                }
326        }
327       
328        $fp = fopen($tool['surveillance_file'], 'w');
329        fwrite($fp, prettyXML($doc->saveXML()));
330        fclose($fp);
331}
332
333
334function addElement($doc, $parent, $tag, $prefix = '') {
335        $node = $doc->createElement($tag, $prefix);
336        $parent->appendChild($node);
337        return($node);
338}
339
340function addAttribute($parent, $name, $value = '') {
341        $attr = $parent->setAttribute($name, $value);
342        $parent->appendChild($attr);
343        return($attr);
344}
345
346function addText($doc, $parent, $text = '') {
347        $node = $doc->createTextNode($text);
348        $parent->appendChild($node);
349        return($node);
350}
351
352function addComment($doc, $parent, $text = '') {
353        $node = $doc->createComment($text);
354        $parent->appendChild($node);
355        return($node);
356}
357
358function addTextElement($doc, $parent, $tag, $text) {
359        $node = addElement($doc, $parent, $tag);
360        addText($doc, $node, $text);
361        return($node);
362}
363
364function prettyXML($sXML) {
365        # Thanks to Joachem Blok on http://us3.php.net/domdocument
366        $doc = new DOMDocument();
367        $doc->preserveWhiteSpace = false;
368        $doc->formatOutput   = true;
369        $doc->loadXML($sXML);
370        return($doc->saveXML());
371}
372
373// PRJ_mysqlDate
374// ===============
375// standardized date as string in MySQL date format
376//  returns a formatted string
377// (relative to the given timebase)
378// which can be rescanned by this routine
379function PRJ_mysqlDate( $dateStr, $relative = "now" ) {
380  $now = strtotime( $relative );
381  $exact = strtotime ( $dateStr, $now );
382
383  $dateArr = getdate( $exact );
384  $ts = mktime($dateArr['hours'], $dateArr['minutes'], $dateArr['seconds'],
385    $dateArr['mon'], $dateArr['mday'], $dateArr['year']);
386  $dateArr = getdate( $ts );
387  $str = sprintf ( "%04d-%02d-%02d %02d:%02d:%02d",
388    $dateArr['year'], $dateArr['mon'], $dateArr['mday'],
389    $dateArr['hours'], $dateArr['minutes'], $dateArr['seconds'] );
390  return ( $str );
391}
392
393?>
Note: See TracBrowser for help on using the repository browser.