ホームページ > php教程 > php手册 > 使用PHP 5.0 轻松解析XML文档(2)

使用PHP 5.0 轻松解析XML文档(2)

WBOY
リリース: 2016-05-26 08:19:46
オリジナル
1163 人が閲覧しました

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

<?php

/**

 *=========================================================

 *

 * @author     hahawen(大龄青年)

 * @since      2004-12-04

 * @copyright  Copyright (c) 2004, NxCoder Group

 *

 *=========================================================

 */

/**

 * class SimpleDocumentParser

 * use SAX parse xml file, and build SimpleDocumentObject

 * all this pachage&#39;s is work for xml file, and method is action as DOM.

 *

 * @package SmartWeb.common.xml

 * @version 1.0

 */

class SimpleDocumentParser {

    private $domRootObject = null;

    private $currentNO = null;

    private $currentName = null;

    private $currentValue = null;

    private $currentAttribute = null;

    public function getSimpleDocument() {

        return $this->domRootObject;

    }

    public function parse($file) {

        $xmlParser = xml_parser_create();

        xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, 0);

        xml_parser_set_option($xmlParser, XML_OPTION_SKIP_WHITE, 1);

        xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, &#39;UTF-8&#39;);

        xml_set_object($xmlParser, $this);

        xml_set_element_handler($xmlParser, "startElement", "endElement");

        xml_set_character_data_handler($xmlParser, "characterData");

        if (!xml_parse($xmlParser, file_get_contents($file))) die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xmlParser)) ,         xml_get_current_line_number($xmlParser)));

        xml_parser_free($xmlParser);

    }

    private function startElement($parser, $name, $attrs) {

        $this->currentName = $name;

        $this->currentAttribute = $attrs;

        if ($this->currentNO == null) {

            $this->domRootObject = new SimpleDocumentRoot($name);

            $this->currentNO = $this->domRootObject;

        } else {

            $this->currentNO = $this->currentNO->createNode($name, $attrs);

        }

    }

    private function endElement($parser, $name) {

        if ($this->currentName == $name) {

            $tag = $this->currentNO->getSeq();

            $this->currentNO = $this->currentNO->getPNodeObject();

            if ($this->currentAttribute != null && sizeof($this->currentAttribute) > 0) $this->currentNO->setValue($name, array(

                &#39;value&#39; => $this->currentValue,

                       &#39;attrs&#39; => $this->currentAttribute

            ));

            else $this->currentNO->setValue($name, $this->currentValue);

            $this->currentNO->removeNode($tag);

        } else {

            $this->currentNO = (is_a($this->currentNO, &#39;SimpleDocumentRoot&#39;)) ? null :          $this->currentNO->getPNodeObject();

        }

    }

    private function characterData($parser, $data) {

        $this->currentValue = iconv(&#39;UTF-8&#39;, &#39;GB2312&#39;, $data);

    }

    function __destruct() {

        unset($this->domRootObject);

    }

}

?>

ログイン後にコピー


永久链接:

转载随意!带上文章地址吧。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート