1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: |
|
11: |
|
12: | |
13: | |
14: | |
15: | |
16: | |
17: | |
18: |
|
19: |
|
20: | defined('XOOPS_ROOT_PATH') || exit('XOOPS root path not defined');
|
21: | require_once(XOOPS_ROOT_PATH . '/class/xml/saxparser.php');
|
22: | require_once(XOOPS_ROOT_PATH . '/class/xml/xmltaghandler.php');
|
23: |
|
24: | |
25: | |
26: |
|
27: | class XoopsXmlRss2Parser extends SaxParser
|
28: | {
|
29: | public $_tempArr = array();
|
30: | public $_channelData = array();
|
31: | public $_imageData = array();
|
32: | public $_items = array();
|
33: |
|
34: | |
35: | |
36: |
|
37: | public function __construct($input)
|
38: | {
|
39: | parent::__construct($input);
|
40: | $this->useUtfEncoding();
|
41: | $this->addTagHandler(new RssChannelHandler());
|
42: | $this->addTagHandler(new RssTitleHandler());
|
43: | $this->addTagHandler(new RssLinkHandler());
|
44: | $this->addTagHandler(new RssGeneratorHandler());
|
45: | $this->addTagHandler(new RssDescriptionHandler());
|
46: | $this->addTagHandler(new RssCopyrightHandler());
|
47: | $this->addTagHandler(new RssNameHandler());
|
48: | $this->addTagHandler(new RssManagingEditorHandler());
|
49: | $this->addTagHandler(new RssLanguageHandler());
|
50: | $this->addTagHandler(new RssLastBuildDateHandler());
|
51: | $this->addTagHandler(new RssWebMasterHandler());
|
52: | $this->addTagHandler(new RssImageHandler());
|
53: | $this->addTagHandler(new RssUrlHandler());
|
54: | $this->addTagHandler(new RssWidthHandler());
|
55: | $this->addTagHandler(new RssHeightHandler());
|
56: | $this->addTagHandler(new RssItemHandler());
|
57: | $this->addTagHandler(new RssCategoryHandler());
|
58: | $this->addTagHandler(new RssPubDateHandler());
|
59: | $this->addTagHandler(new RssCommentsHandler());
|
60: | $this->addTagHandler(new RssSourceHandler());
|
61: | $this->addTagHandler(new RssAuthorHandler());
|
62: | $this->addTagHandler(new RssGuidHandler());
|
63: | $this->addTagHandler(new RssTextInputHandler());
|
64: | }
|
65: |
|
66: | |
67: | |
68: | |
69: |
|
70: | public function setChannelData($name, &$value)
|
71: | {
|
72: | if (!isset($this->_channelData[$name])) {
|
73: | $this->_channelData[$name] =& $value;
|
74: | } else {
|
75: | $this->_channelData[$name] .= $value;
|
76: | }
|
77: | }
|
78: |
|
79: | |
80: | |
81: | |
82: | |
83: |
|
84: | public function &getChannelData($name = null)
|
85: | {
|
86: | if (isset($name)) {
|
87: | if (isset($this->_channelData[$name])) {
|
88: | return $this->_channelData[$name];
|
89: | }
|
90: |
|
91: | return false;
|
92: | }
|
93: |
|
94: | return $this->_channelData;
|
95: | }
|
96: |
|
97: | |
98: | |
99: | |
100: |
|
101: | public function setImageData($name, &$value)
|
102: | {
|
103: | $this->_imageData[$name] =& $value;
|
104: | }
|
105: |
|
106: | |
107: | |
108: | |
109: | |
110: |
|
111: | public function &getImageData($name = null)
|
112: | {
|
113: | if (isset($name)) {
|
114: | if (isset($this->_imageData[$name])) {
|
115: | return $this->_imageData[$name];
|
116: | }
|
117: | $return = false;
|
118: |
|
119: | return $return;
|
120: | }
|
121: |
|
122: | return $this->_imageData;
|
123: | }
|
124: |
|
125: | |
126: | |
127: |
|
128: | public function setItems(&$itemarr)
|
129: | {
|
130: | $this->_items[] =& $itemarr;
|
131: | }
|
132: |
|
133: | |
134: | |
135: |
|
136: | public function &getItems()
|
137: | {
|
138: | return $this->_items;
|
139: | }
|
140: |
|
141: | |
142: | |
143: | |
144: | |
145: |
|
146: | public function setTempArr($name, &$value, $delim = '')
|
147: | {
|
148: | if (!isset($this->_tempArr[$name])) {
|
149: | $this->_tempArr[$name] =& $value;
|
150: | } else {
|
151: | $this->_tempArr[$name] .= $delim . $value;
|
152: | }
|
153: | }
|
154: |
|
155: | |
156: | |
157: |
|
158: | public function getTempArr()
|
159: | {
|
160: | return $this->_tempArr;
|
161: | }
|
162: |
|
163: | public function resetTempArr()
|
164: | {
|
165: | unset($this->_tempArr);
|
166: | $this->_tempArr = array();
|
167: | }
|
168: | }
|
169: |
|
170: | |
171: | |
172: |
|
173: | class RssChannelHandler extends XmlTagHandler
|
174: | {
|
175: | |
176: | |
177: |
|
178: | public function __construct()
|
179: | {
|
180: | }
|
181: |
|
182: | |
183: | |
184: |
|
185: | public function getName()
|
186: | {
|
187: | return 'channel';
|
188: | }
|
189: | }
|
190: |
|
191: | |
192: | |
193: |
|
194: | class RssTitleHandler extends XmlTagHandler
|
195: | {
|
196: | |
197: | |
198: |
|
199: | public function __construct()
|
200: | {
|
201: | }
|
202: |
|
203: | |
204: | |
205: |
|
206: | public function getName()
|
207: | {
|
208: | return 'title';
|
209: | }
|
210: |
|
211: | |
212: | |
213: | |
214: |
|
215: | public function handleCharacterData($parser, &$data)
|
216: | {
|
217: | switch ($parser->getParentTag()) {
|
218: | case 'channel':
|
219: | $parser->setChannelData('title', $data);
|
220: | break;
|
221: | case 'image':
|
222: | $parser->setImageData('title', $data);
|
223: | break;
|
224: | case 'item':
|
225: | case 'textInput':
|
226: | $parser->setTempArr('title', $data);
|
227: | break;
|
228: | default:
|
229: | break;
|
230: | }
|
231: | }
|
232: | }
|
233: |
|
234: | |
235: | |
236: |
|
237: | class RssLinkHandler extends XmlTagHandler
|
238: | {
|
239: | |
240: | |
241: |
|
242: | public function __construct()
|
243: | {
|
244: | }
|
245: |
|
246: | |
247: | |
248: |
|
249: | public function getName()
|
250: | {
|
251: | return 'link';
|
252: | }
|
253: |
|
254: | |
255: | |
256: | |
257: |
|
258: | public function handleCharacterData($parser, &$data)
|
259: | {
|
260: | switch ($parser->getParentTag()) {
|
261: | case 'channel':
|
262: | $parser->setChannelData('link', $data);
|
263: | break;
|
264: | case 'image':
|
265: | $parser->setImageData('link', $data);
|
266: | break;
|
267: | case 'item':
|
268: | case 'textInput':
|
269: | $parser->setTempArr('link', $data);
|
270: | break;
|
271: | default:
|
272: | break;
|
273: | }
|
274: | }
|
275: | }
|
276: |
|
277: | |
278: | |
279: |
|
280: | class RssDescriptionHandler extends XmlTagHandler
|
281: | {
|
282: | |
283: | |
284: |
|
285: | public function __construct()
|
286: | {
|
287: | }
|
288: |
|
289: | |
290: | |
291: |
|
292: | public function getName()
|
293: | {
|
294: | return 'description';
|
295: | }
|
296: |
|
297: | |
298: | |
299: | |
300: |
|
301: | public function handleCharacterData($parser, &$data)
|
302: | {
|
303: | switch ($parser->getParentTag()) {
|
304: | case 'channel':
|
305: | $parser->setChannelData('description', $data);
|
306: | break;
|
307: | case 'image':
|
308: | $parser->setImageData('description', $data);
|
309: | break;
|
310: | case 'item':
|
311: | case 'textInput':
|
312: | $parser->setTempArr('description', $data);
|
313: | break;
|
314: | default:
|
315: | break;
|
316: | }
|
317: | }
|
318: | }
|
319: |
|
320: | |
321: | |
322: |
|
323: | class RssGeneratorHandler extends XmlTagHandler
|
324: | {
|
325: | |
326: | |
327: |
|
328: | public function __construct()
|
329: | {
|
330: | }
|
331: |
|
332: | |
333: | |
334: |
|
335: | public function getName()
|
336: | {
|
337: | return 'generator';
|
338: | }
|
339: |
|
340: | |
341: | |
342: | |
343: |
|
344: | public function handleCharacterData($parser, &$data)
|
345: | {
|
346: | switch ($parser->getParentTag()) {
|
347: | case 'channel':
|
348: | $parser->setChannelData('generator', $data);
|
349: | break;
|
350: | default:
|
351: | break;
|
352: | }
|
353: | }
|
354: | }
|
355: |
|
356: | |
357: | |
358: |
|
359: | class RssCopyrightHandler extends XmlTagHandler
|
360: | {
|
361: | |
362: | |
363: |
|
364: | public function __construct()
|
365: | {
|
366: | }
|
367: |
|
368: | |
369: | |
370: |
|
371: | public function getName()
|
372: | {
|
373: | return 'copyright';
|
374: | }
|
375: |
|
376: | |
377: | |
378: | |
379: |
|
380: | public function handleCharacterData($parser, &$data)
|
381: | {
|
382: | switch ($parser->getParentTag()) {
|
383: | case 'channel':
|
384: | $parser->setChannelData('copyright', $data);
|
385: | break;
|
386: | default:
|
387: | break;
|
388: | }
|
389: | }
|
390: | }
|
391: |
|
392: | |
393: | |
394: |
|
395: | class RssNameHandler extends XmlTagHandler
|
396: | {
|
397: | |
398: | |
399: |
|
400: | public function __construct()
|
401: | {
|
402: | }
|
403: |
|
404: | |
405: | |
406: |
|
407: | public function getName()
|
408: | {
|
409: | return 'name';
|
410: | }
|
411: |
|
412: | |
413: | |
414: | |
415: |
|
416: | public function handleCharacterData($parser, &$data)
|
417: | {
|
418: | switch ($parser->getParentTag()) {
|
419: | case 'textInput':
|
420: | $parser->setTempArr('name', $data);
|
421: | break;
|
422: | default:
|
423: | break;
|
424: | }
|
425: | }
|
426: | }
|
427: |
|
428: | |
429: | |
430: |
|
431: | class RssManagingEditorHandler extends XmlTagHandler
|
432: | {
|
433: | |
434: | |
435: |
|
436: | public function __construct()
|
437: | {
|
438: | }
|
439: |
|
440: | |
441: | |
442: |
|
443: | public function getName()
|
444: | {
|
445: | return 'managingEditor';
|
446: | }
|
447: |
|
448: | |
449: | |
450: | |
451: |
|
452: | public function handleCharacterData($parser, &$data)
|
453: | {
|
454: | switch ($parser->getParentTag()) {
|
455: | case 'channel':
|
456: | $parser->setChannelData('editor', $data);
|
457: | break;
|
458: | default:
|
459: | break;
|
460: | }
|
461: | }
|
462: | }
|
463: |
|
464: | |
465: | |
466: |
|
467: | class RssLanguageHandler extends XmlTagHandler
|
468: | {
|
469: | |
470: | |
471: |
|
472: | public function __construct()
|
473: | {
|
474: | }
|
475: |
|
476: | |
477: | |
478: |
|
479: | public function getName()
|
480: | {
|
481: | return 'language';
|
482: | }
|
483: |
|
484: | |
485: | |
486: | |
487: |
|
488: | public function handleCharacterData($parser, &$data)
|
489: | {
|
490: | switch ($parser->getParentTag()) {
|
491: | case 'channel':
|
492: | $parser->setChannelData('language', $data);
|
493: | break;
|
494: | default:
|
495: | break;
|
496: | }
|
497: | }
|
498: | }
|
499: |
|
500: | |
501: | |
502: |
|
503: | class RssWebMasterHandler extends XmlTagHandler
|
504: | {
|
505: | |
506: | |
507: |
|
508: | public function __construct()
|
509: | {
|
510: | }
|
511: |
|
512: | |
513: | |
514: |
|
515: | public function getName()
|
516: | {
|
517: | return 'webMaster';
|
518: | }
|
519: |
|
520: | |
521: | |
522: | |
523: |
|
524: | public function handleCharacterData($parser, &$data)
|
525: | {
|
526: | switch ($parser->getParentTag()) {
|
527: | case 'channel':
|
528: | $parser->setChannelData('webmaster', $data);
|
529: | break;
|
530: | default:
|
531: | break;
|
532: | }
|
533: | }
|
534: | }
|
535: |
|
536: | |
537: | |
538: |
|
539: | class RssDocsHandler extends XmlTagHandler
|
540: | {
|
541: | |
542: | |
543: |
|
544: | public function __construct()
|
545: | {
|
546: | }
|
547: |
|
548: | |
549: | |
550: |
|
551: | public function getName()
|
552: | {
|
553: | return 'docs';
|
554: | }
|
555: |
|
556: | |
557: | |
558: | |
559: |
|
560: | public function handleCharacterData($parser, &$data)
|
561: | {
|
562: | switch ($parser->getParentTag()) {
|
563: | case 'channel':
|
564: | $parser->setChannelData('docs', $data);
|
565: | break;
|
566: | default:
|
567: | break;
|
568: | }
|
569: | }
|
570: | }
|
571: |
|
572: | |
573: | |
574: |
|
575: | class RssTtlHandler extends XmlTagHandler
|
576: | {
|
577: | |
578: | |
579: |
|
580: | public function __construct()
|
581: | {
|
582: | }
|
583: |
|
584: | |
585: | |
586: |
|
587: | public function getName()
|
588: | {
|
589: | return 'ttl';
|
590: | }
|
591: |
|
592: | |
593: | |
594: | |
595: |
|
596: | public function handleCharacterData($parser, &$data)
|
597: | {
|
598: | switch ($parser->getParentTag()) {
|
599: | case 'channel':
|
600: | $parser->setChannelData('ttl', $data);
|
601: | break;
|
602: | default:
|
603: | break;
|
604: | }
|
605: | }
|
606: | }
|
607: |
|
608: | |
609: | |
610: |
|
611: | class RssTextInputHandler extends XmlTagHandler
|
612: | {
|
613: | public function RssWebMasterHandler()
|
614: | {
|
615: | }
|
616: |
|
617: | |
618: | |
619: |
|
620: | public function getName()
|
621: | {
|
622: | return 'textInput';
|
623: | }
|
624: |
|
625: | |
626: | |
627: | |
628: |
|
629: | public function handleBeginElement($parser, &$attributes)
|
630: | {
|
631: | $parser->resetTempArr();
|
632: | }
|
633: |
|
634: | |
635: | |
636: |
|
637: | public function handleEndElement($parser)
|
638: | {
|
639: | $parser->setChannelData('textinput', $parser->getTempArr());
|
640: | }
|
641: | }
|
642: |
|
643: | |
644: | |
645: |
|
646: | class RssLastBuildDateHandler extends XmlTagHandler
|
647: | {
|
648: | |
649: | |
650: |
|
651: | public function __construct()
|
652: | {
|
653: | }
|
654: |
|
655: | |
656: | |
657: |
|
658: | public function getName()
|
659: | {
|
660: | return 'lastBuildDate';
|
661: | }
|
662: |
|
663: | |
664: | |
665: | |
666: |
|
667: | public function handleCharacterData($parser, &$data)
|
668: | {
|
669: | switch ($parser->getParentTag()) {
|
670: | case 'channel':
|
671: | $parser->setChannelData('lastbuilddate', $data);
|
672: | break;
|
673: | default:
|
674: | break;
|
675: | }
|
676: | }
|
677: | }
|
678: |
|
679: | |
680: | |
681: |
|
682: | class RssImageHandler extends XmlTagHandler
|
683: | {
|
684: | |
685: | |
686: |
|
687: | public function __construct()
|
688: | {
|
689: | }
|
690: |
|
691: | |
692: | |
693: |
|
694: | public function getName()
|
695: | {
|
696: | return 'image';
|
697: | }
|
698: | }
|
699: |
|
700: | |
701: | |
702: |
|
703: | class RssUrlHandler extends XmlTagHandler
|
704: | {
|
705: | |
706: | |
707: |
|
708: | public function __construct()
|
709: | {
|
710: | }
|
711: |
|
712: | |
713: | |
714: |
|
715: | public function getName()
|
716: | {
|
717: | return 'url';
|
718: | }
|
719: |
|
720: | |
721: | |
722: | |
723: |
|
724: | public function handleCharacterData($parser, &$data)
|
725: | {
|
726: | if ($parser->getParentTag() === 'image') {
|
727: | $parser->setImageData('url', $data);
|
728: | }
|
729: | }
|
730: | }
|
731: |
|
732: | |
733: | |
734: |
|
735: | class RssWidthHandler extends XmlTagHandler
|
736: | {
|
737: | |
738: | |
739: |
|
740: | public function __construct()
|
741: | {
|
742: | }
|
743: |
|
744: | |
745: | |
746: |
|
747: | public function getName()
|
748: | {
|
749: | return 'width';
|
750: | }
|
751: |
|
752: | |
753: | |
754: | |
755: |
|
756: | public function handleCharacterData($parser, &$data)
|
757: | {
|
758: | if ($parser->getParentTag() === 'image') {
|
759: | $parser->setImageData('width', $data);
|
760: | }
|
761: | }
|
762: | }
|
763: |
|
764: | |
765: | |
766: |
|
767: | class RssHeightHandler extends XmlTagHandler
|
768: | {
|
769: | |
770: | |
771: |
|
772: | public function __construct()
|
773: | {
|
774: | }
|
775: |
|
776: | |
777: | |
778: |
|
779: | public function getName()
|
780: | {
|
781: | return 'height';
|
782: | }
|
783: |
|
784: | |
785: | |
786: | |
787: |
|
788: | public function handleCharacterData($parser, &$data)
|
789: | {
|
790: | if ($parser->getParentTag() === 'image') {
|
791: | $parser->setImageData('height', $data);
|
792: | }
|
793: | }
|
794: | }
|
795: |
|
796: | |
797: | |
798: |
|
799: | class RssItemHandler extends XmlTagHandler
|
800: | {
|
801: | |
802: | |
803: |
|
804: | public function __construct()
|
805: | {
|
806: | }
|
807: |
|
808: | |
809: | |
810: |
|
811: | public function getName()
|
812: | {
|
813: | return 'item';
|
814: | }
|
815: |
|
816: | |
817: | |
818: | |
819: |
|
820: | public function handleBeginElement($parser, &$attributes)
|
821: | {
|
822: | $parser->resetTempArr();
|
823: | }
|
824: |
|
825: | |
826: | |
827: |
|
828: | public function handleEndElement($parser)
|
829: | {
|
830: | $items = $parser->getTempArr();
|
831: | $parser->setItems($items);
|
832: | }
|
833: | }
|
834: |
|
835: | |
836: | |
837: |
|
838: | class RssCategoryHandler extends XmlTagHandler
|
839: | {
|
840: | |
841: | |
842: |
|
843: | public function __construct()
|
844: | {
|
845: | }
|
846: |
|
847: | |
848: | |
849: |
|
850: | public function getName()
|
851: | {
|
852: | return 'category';
|
853: | }
|
854: |
|
855: | |
856: | |
857: | |
858: |
|
859: | public function handleCharacterData($parser, &$data)
|
860: | {
|
861: | switch ($parser->getParentTag()) {
|
862: | case 'channel':
|
863: | $parser->setChannelData('category', $data);
|
864: | break;
|
865: | case 'item':
|
866: | $parser->setTempArr('category', $data, ', ');
|
867: | break;
|
868: | default:
|
869: | break;
|
870: | }
|
871: | }
|
872: | }
|
873: |
|
874: | |
875: | |
876: |
|
877: | class RssCommentsHandler extends XmlTagHandler
|
878: | {
|
879: | |
880: | |
881: |
|
882: | public function __construct()
|
883: | {
|
884: | }
|
885: |
|
886: | |
887: | |
888: |
|
889: | public function getName()
|
890: | {
|
891: | return 'comments';
|
892: | }
|
893: |
|
894: | |
895: | |
896: | |
897: |
|
898: | public function handleCharacterData($parser, &$data)
|
899: | {
|
900: | if ($parser->getParentTag() === 'item') {
|
901: | $parser->setTempArr('comments', $data);
|
902: | }
|
903: | }
|
904: | }
|
905: |
|
906: | |
907: | |
908: |
|
909: | class RssPubDateHandler extends XmlTagHandler
|
910: | {
|
911: | |
912: | |
913: |
|
914: | public function __construct()
|
915: | {
|
916: | }
|
917: |
|
918: | |
919: | |
920: |
|
921: | public function getName()
|
922: | {
|
923: | return 'pubDate';
|
924: | }
|
925: |
|
926: | |
927: | |
928: | |
929: |
|
930: | public function handleCharacterData($parser, &$data)
|
931: | {
|
932: | switch ($parser->getParentTag()) {
|
933: | case 'channel':
|
934: | $parser->setChannelData('pubdate', $data);
|
935: | break;
|
936: | case 'item':
|
937: | $parser->setTempArr('pubdate', $data);
|
938: | break;
|
939: | default:
|
940: | break;
|
941: | }
|
942: | }
|
943: | }
|
944: |
|
945: | |
946: | |
947: |
|
948: | class RssGuidHandler extends XmlTagHandler
|
949: | {
|
950: | |
951: | |
952: |
|
953: | public function __construct()
|
954: | {
|
955: | }
|
956: |
|
957: | |
958: | |
959: |
|
960: | public function getName()
|
961: | {
|
962: | return 'guid';
|
963: | }
|
964: |
|
965: | |
966: | |
967: | |
968: |
|
969: | public function handleCharacterData($parser, &$data)
|
970: | {
|
971: | if ($parser->getParentTag() === 'item') {
|
972: | $parser->setTempArr('guid', $data);
|
973: | }
|
974: | }
|
975: | }
|
976: |
|
977: | |
978: | |
979: |
|
980: | class RssAuthorHandler extends XmlTagHandler
|
981: | {
|
982: | public function RssGuidHandler()
|
983: | {
|
984: | }
|
985: |
|
986: | |
987: | |
988: |
|
989: | public function getName()
|
990: | {
|
991: | return 'author';
|
992: | }
|
993: |
|
994: | |
995: | |
996: | |
997: |
|
998: | public function handleCharacterData($parser, &$data)
|
999: | {
|
1000: | if ($parser->getParentTag() === 'item') {
|
1001: | $parser->setTempArr('author', $data);
|
1002: | }
|
1003: | }
|
1004: | }
|
1005: |
|
1006: | |
1007: | |
1008: |
|
1009: | class RssSourceHandler extends XmlTagHandler
|
1010: | {
|
1011: | |
1012: | |
1013: |
|
1014: | public function __construct()
|
1015: | {
|
1016: | }
|
1017: |
|
1018: | |
1019: | |
1020: |
|
1021: | public function getName()
|
1022: | {
|
1023: | return 'source';
|
1024: | }
|
1025: |
|
1026: | |
1027: | |
1028: | |
1029: |
|
1030: | public function handleBeginElement($parser, &$attributes)
|
1031: | {
|
1032: | if ($parser->getParentTag() === 'item') {
|
1033: | $parser->setTempArr('source_url', $attributes['url']);
|
1034: | }
|
1035: | }
|
1036: |
|
1037: | |
1038: | |
1039: | |
1040: |
|
1041: | public function handleCharacterData($parser, &$data)
|
1042: | {
|
1043: | if ($parser->getParentTag() === 'item') {
|
1044: | $parser->setTempArr('source', $data);
|
1045: | }
|
1046: | }
|
1047: | }
|
1048: | |