1. 程式人生 > >PHP讀寫XML檔案的四種方法

PHP讀寫XML檔案的四種方法

  PHP對XML檔案進行讀寫操作的方法一共有四種,分別是:字串方式直接讀寫、DOMDocument讀寫、XMLWrite寫和XMLReader讀、SimpleXML讀寫,本文將依次對這四種方法進行介紹。

  介紹之前首先對本文例子使用的資料和檔案進行說明。本文寫XML檔案的例子都是從MySQL中讀取資料然後寫入到XML檔案中,讀XML檔案的例子都是從XML檔案中讀取資料後組裝成陣列的格式,陣列中每個元素對應資料庫中的一條記錄。

MySQL中的資料:

XML檔案:

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

<?xml version="1.0" encoding="utf8"?>

<studentcareer>

<period>

<starttime>2000</starttime>

<endtime>2002</endtime>

<school>培新小學</school>

</period>

<period>

<starttime>2002</starttime>

<endtime>2006</endtime>

<school>覽表東陽學校</school>

</period>

<period>

<starttime>2006</starttime>

<endtime>2009</endtime>

<school>惠來慈雲實驗中學</school>

</period>

<period>

<starttime>2009</starttime>

<endtime>2012</endtime>

<school>惠來一中</school>

</period>

<period>

<starttime>2012</starttime>

<endtime>2016</endtime>

<school>華南師範大學</school>

</period>

</studentcareer>

讀取XML檔案後組裝成的資料格式:

  下面的例子使用的資料、檔案都是以上所列資料、檔案,介紹各個方法時不再贅述,直接貼程式碼。

一、PHP字串方式讀寫XML檔案:

1. 字串方式寫XML檔案:

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

<?php

/**

* function:使用字串方式寫XML檔案

* author:JetWu

* date:2016.12.03

**/

$mysqli = mysqli_connect('localhost''root''123456''wjt');

if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());

$sql 'select * from study order by starttime';

$res = mysqli_query($mysqli$sql);

$study array();

while($row = mysqli_fetch_array($res)) {

$study[] = $row;

}

//XML標籤配置

$xmlTag array(

'starttime',

'endtime',

'school'

);

$str "<studentcareer>\n";

foreach($study as $v) {

$str .= "\t<period>\n";

foreach($xmlTag as $x) {

$str .= "\t\t<".$x.">" $v[$x] . "</".$x.">\n";

}

$str .= "\t</period>\n";

}

$str .= '</studentcareer>';

$file './write_str.xml';

file_put_contents($file$str);

2. 字串方式讀XML檔案:

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

<?php

/**

* function:使用字串方式讀XML檔案

* author:JetWu

* date:2016.12.03

**/

$file './write_str.xml';

$con file_get_contents($file);

//XML標籤配置

$xmlTag array(

'starttime',

'endtime',

'school'

);

$arr array();

foreach($xmlTag as $x) {

preg_match_all("/<".$x.">.*<\/".$x.">/"$con$temp);

$arr[] = $temp[0];

}

//去除XML標籤並組裝資料

$data array();

foreach($arr as $key => $value) {

foreach($value as $k => $v) {

$a explode($xmlTag[$key].'>'$v);

$v substr($a[1], 0, strlen($a[1])-2);

$data[$k][$xmlTag[$key]] = $v;

}

}

echo '<pre>';

print_r($data);

二、DOMDocument讀寫XML檔案

1. DOMDocument寫XML檔案:

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

<?php

/**

* function:DOMDocument寫XML檔案

* author:JetWu

* date:2016.12.03

**/

$mysqli = mysqli_connect('localhost''root''123456''wjt');

if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());

$sql 'select * from study order by starttime';

$res = mysqli_query($mysqli$sql);

$study array();

while($row = mysqli_fetch_array($res)) {

$study[] = $row;

}

//XML標籤配置

$xmlTag array(

'starttime',

'endtime',

'school'

);

$dom new DOMDocument('1.0''utf8');

$dom->formatOutput = true;

$studentcareer $dom->createElement('studentcareer');

$dom->appendChild($studentcareer);

foreach($study as $s) {

$period $dom->createElement('period');

$studentcareer->appendChild($period);

foreach($xmlTag as $x) {

$element $dom->createElement($x);

$period->appendChild($element);

$text $dom->createTextNode($s[$x]);

$element->appendChild($text);

}

}

$dom->save('./write_dom.xml');

2. DOMDocument讀XML檔案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?php

/**

* function:DOMDocument讀XML檔案

* author:JetWu

* date:2016.12.03

**/

//XML標籤配置

$xmlTag array(

'starttime',

'endtime',

'school'

);

$dom new DOMDocument();

$dom->load('./write_dom.xml');

$periods $dom->getElementsByTagName('period');

$study array();

foreach($periods as $k => $p) {

foreach($xmlTag as $x) {

$node $p->getElementsByTagName($x);

$study[$k][$x] = $node->item(0)->nodeValue;

}

}

echo '<pre>';

print_r($study);

三、XMLWriter和XMLReader讀寫XML檔案

1. XMLWriter寫XML檔案:

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

<?php

/**

* function:XMLWriter寫XML檔案

* author:JetWu

* date:2016.12.03

**/

$mysqli = mysqli_connect('localhost''root''123456''wjt');

if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());

$sql 'select * from study order by starttime';

$res = mysqli_query($mysqli$sql);

$study array();

while($row = mysqli_fetch_array($res)) {

$study[] = $row;

}

//XML標籤配置

$xmlTag array(

'starttime',

'endtime',

'school'

);

$xml new XMLWriter();

$xml->openUri('./write_WR.xml');

$xml->setIndentString('  ');//設定縮排格式化使用的符號

$xml->setIndent(true);

$xml->startDocument('1.0''utf8');

$xml->startElement('studentcareer');

foreach($study as $s) {

$xml->startElement('period');

foreach($xmlTag as $x) {

$xml->startElement($x);

$xml->text($s[$x]);

$xml->endElement();

}

$xml->endElement();

}

$xml->endElement();

$xml->endDocument();

$xml->flush();

2. XMLReader讀XML檔案:

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

<?php

/**

* function:XMLReader讀XML檔案

* author:JetWu

* date:2016.12.03

**/

//XML標籤配置

$xmlTag array(

'starttime',

'endtime',

'school'

);

$xml new XMLReader();

$xml->open('./write_WR.xml');

$study array();

$count = 0;//記錄數:方便組裝資料

$name '';

while($xml->read()) {

$n $xml->name;

if($xml->nodeType == XMLReader::ELEMENT) {

if($n == 'period') {//開始下一條記錄的讀取

$count ++;

else if(in_array($n$xmlTag)) {//記錄需要獲取文字值的標籤名

$name $n;

}

else if($xml->nodeType == XMLReader::TEXT) {

if(in_array($name$xmlTag)) {

$study[$count][$name] = $xml->value;

}

}

}

$xml->close();

echo '<pre>';

print_r($study);

四、SimpleXML讀寫XML檔案

1. SimpleXML寫XML檔案:

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

<?php

/**

* function:SimpleXML寫XML檔案

* author:JetWu

* date:2016.12.03

**/

$mysqli = mysqli_connect('localhost''root''123456''wjt');

if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());

$sql 'select * from study order by starttime';

$res = mysqli_query($mysqli$sql);

$study array();

while($row = mysqli_fetch_array($res)) {

$study[] = $row;

}

//XML標籤配置

$xmlTag array(

'starttime',

'endtime',

'school'

);

$xml new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><studentcareer />');

foreach($study as $s) {

$period $xml->addChild('period');

foreach($xmlTag as $x) {

$period->addChild($x$s[$x]);

}

}

$xml->asXml('./write_sim.xml');//輸出XML檔案(沒有格式化)

2. SimpleXML讀XML檔案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<?php

/**

* function:SimpleXML讀XML檔案

* author:JetWu

* date:2016.12.03

**/

//XML標籤配置

$xmlTag array(

'starttime',

'endtime',

'school'

);

$study array();

$xml = simplexml_load_file('./write_sim.xml');

foreach($xml->children() as $period) {

$study[] = get_object_vars($period);//獲取物件全部屬性,返回陣列

}

echo '<pre>';

print_r($study);

  總結:這四種方法中,字串的方式是最原始的方法。SimpleXML和DOM擴充套件是屬於基於樹的解析器,把整個文件儲存為樹的資料結構中,需要把整個文件都載入到記憶體中才能工作,所以當處理大型XML文件的時候,效能會劇減。XMLReader則是屬於基於流的解析器,它不會一次把整個文件載入到記憶體中,而是每次分別讀取其中的一個節點並允許實時與之互動,這種方式效率高,而且佔記憶體少。