PHP XML Library:一个不错的PHP XML操作类_PHP_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > PHP > PHP XML Library:一个不错的PHP XML操作类

PHP XML Library:一个不错的PHP XML操作类

 2011/11/9 8:26:27  abc123456789cba  http://qianxunniao.iteye.com  我要评论(0)
  • 摘要:今天在PHP4环境下重新写一个接口程序,需要大量分析解析XML,PHP的xml_parse_into_struct()函数不能直接生成便于使用的数组,而SimpleXML扩展在PHP5中才支持,于是逛逛搜索引擎,在老外的网站上找到了一个不错的PHPXML操作类。一、用法举例:1、将XML文件解释成便于使用的数组:viewplaincopytoclipboardprint?<?phpinclude('xml.php');//引用PHPXML操作类$xml=file_get_contents
  • 标签:PHP 一个 操作 XML操作 XML

  今天在PHP4环境下重新写一个接口程序,需要大量分析解析XML,PHP的xml_parse_into_struct()函数不能直接生成便于使用的数组,而SimpleXML扩展在PHP5中才支持,于是逛逛搜索引擎,在老外的网站上找到了一个不错的PHP XML操作类。

一、用法举例:
1、将XML文件解释成便于使用的数组:

view plaincopy to clipboardprint?
  1. <?php ??
  2. include('xml.php');????//引用PHP?XML操作类 ??
  3. $xml?=?file_get_contents('data.xml');????//读取XML文件 ??
  4. //$xml?=?file_get_contents("php://input");????//读取POST过来的输入流 ??
  5. $data=XML_unserialize($xml); ??
  6. echo?'<pre>'; ??
  7. print_r($data); ??
  8. echo?'</pre>'; ??
  9. ?>??



data.xml文件:

view plaincopy to clipboardprint?
  1. <?xml?version="1.0"?encoding="GBK"?>??
  2. <video>??
  3. <upload>??
  4. <videoid>998</videoid>??
  5. <name><![CDATA[回忆未来]]></name>??
  6. <memo><![CDATA[def]]></memo>??
  7. <up_userid>11317</up_userid>??
  8. </upload>??
  9. </video>??



利用该XML操作类生成的对应数组(汉字编码:UTF-8):

view plaincopy to clipboardprint?
  1. Array ??
  2. ( ??
  3. ????[video]?=>?Array ??
  4. ????????( ??
  5. ????????????[upload]?=>?Array ??
  6. ????????????????( ??
  7. ????????????????????[videoid]?=>?998 ??
  8. ????????????????????[name]?=>?回忆未来 ??
  9. ????????????????????[memo]?=>?def ??
  10. ????????????????????[up_userid]?=>?11317 ??
  11. ????????????????) ??
  12. ??
  13. ????????) ??
  14. ??
  15. )??



2、将数组转换成XML文件:

view plaincopy to clipboardprint?
  1. <?php ??
  2. include('xml.php');//引用PHP?XML操作类 ??
  3. $xml?=?XML_serialize($data); ??
  4. ?>??



二、PHP XML操作类源代码:

view plaincopy to clipboardprint?
  1. <?php? ??
  2. ###################################################################################? ??
  3. #? ??
  4. #?XML?Library,?by?Keith?Devens,?version?1.2b? ??
  5. #?<a?href="http://keithdevens.com/software/phpxml"?target="_blank">http://keithdevens.com/software/phpxml</a>? ??
  6. #? ??
  7. #?This?code?is?Open?Source,?released?under?terms?similar?to?the?Artistic?License.? ??
  8. #?Read?the?license?at?<a?href="http://keithdevens.com/software/license"?target="_blank">http://keithdevens.com/software/license</a>? ??
  9. #? ??
  10. ###################################################################################? ??
  11. ??
  12. ###################################################################################? ??
  13. #?XML_unserialize:?takes?raw?XML?as?a?parameter?(a?string)? ??
  14. #?and?returns?an?equivalent?PHP?data?structure? ??
  15. ###################################################################################? ??
  16. function?&?XML_unserialize(&$xml){? ??
  17. ????$xml_parser?=?&new?XML();? ??
  18. ????$data?=?&$xml_parser->parse($xml);? ??
  19. ????$xml_parser->destruct();? ??
  20. ????return?$data;? ??
  21. }? ??
  22. ###################################################################################? ??
  23. #?XML_serialize:?serializes?any?PHP?data?structure?into?XML? ??
  24. #?Takes?one?parameter:?the?data?to?serialize.?Must?be?an?array.? ??
  25. ###################################################################################? ??
  26. function?&?XML_serialize(&$data,?$level?=?0,?$prior_key?=?NULL){? ??
  27. ????if($level?==?0){?ob_start();?echo?'<?xml?version="1.0"??>',"\n";?}? ??
  28. ????while(list($key,?$value)?=?each($data))? ??
  29. ????????if(!strpos($key,?'?attr'))?#if?it's?not?an?attribute? ?
  30. ????????????#we?don't?treat?attributes?by?themselves,?so?for?an?emptyempty?element? ??
  31. ????????????#?that?has?attributes?you?still?need?to?set?the?element?to?NULL? ??
  32. ??
  33. ????????????if(is_array($value)?and?array_key_exists(0,?$value)){? ??
  34. ????????????????XML_serialize($value,?$level,?$key);? ??
  35. ????????????}else{? ??
  36. ????????????????$tag?=?$prior_key???$prior_key?:?$key;? ??
  37. ????????????????echo?str_repeat("\t",?$level),'<',$tag;? ??
  38. ????????????????if(array_key_exists("$key?attr",?$data)){?#if?there's?an?attribute?for?this?element? ?
  39. ????????????????????while(list($attr_name,?$attr_value)?=?each($data["$key?attr"]))? ?
  40. ????????????????????????echo?'?',$attr_name,'="',htmlspecialchars($attr_value),'"';? ?
  41. ????????????????????reset($data["$key?attr"]);? ?
  42. ????????????????}? ?
  43. ?
  44. ????????????????if(is_null($value))?echo?"?/>\n";? ?
  45. ????????????????elseif(!is_array($value))?echo?'>',htmlspecialchars($value),"</$tag>\n";? ?
  46. ????????????????else?echo?">\n",XML_serialize($value,?$level+1),str_repeat("\t",?$level),"</$tag>\n";? ?
  47. ????????????}? ?
  48. ????reset($data);? ?
  49. ????if($level?==?0){?$str?=?&ob_get_contents();?ob_end_clean();?return?$str;?}? ?
  50. }? ?
  51. ###################################################################################? ?
  52. #?XML?class:?utility?class?to?be?used?with?PHP's?XML?handling?functions? ??
  53. ###################################################################################? ??
  54. class?XML{? ??
  55. ????var?$parser;???#a?reference?to?the?XML?parser? ??
  56. ????var?$document;?#the?entire?XML?structure?built?up?so?far? ??
  57. ????var?$parent;???#a?pointer?to?the?current?parent?-?the?parent?will?be?an?array? ??
  58. ????var?$stack;????#a?stack?of?the?most?recent?parent?at?each?nesting?level? ??
  59. ????var?$last_opened_tag;?#keeps?track?of?the?last?tag?opened.? ??
  60. ??
  61. ????function?XML(){? ??
  62. ?????????$this->parser?=?&xml_parser_create();? ??
  63. ????????xml_parser_set_option(&$this->parser,?XML_OPTION_CASE_FOLDING,?false);? ??
  64. ????????xml_set_object(&$this->parser,?&$this);? ??
  65. ????????xml_set_element_handler(&$this->parser,?'open','close');? ??
  66. ????????xml_set_character_data_handler(&$this->parser,?'data');? ??
  67. ????}? ??
  68. ????function?destruct(){?xml_parser_free(&$this->parser);?}? ??
  69. ????function?&?parse(&$data){? ??
  70. ????????$this->document?=?array();? ??
  71. ????????$this->stack????=?array();? ??
  72. ????????$this->parent???=?&$this->document;? ??
  73. ????????return?xml_parse(&$this->parser,?&$data,?true)???$this->document?:?NULL;? ??
  74. ????}? ??
  75. ????function?open(&$parser,?$tag,?$attributes){? ??
  76. ????????$this->data?=?'';?#stores?temporary?cdata? ??
  77. ????????$this->last_opened_tag?=?$tag;? ??
  78. ????????if(is_array($this->parent)?and?array_key_exists($tag,$this->parent)){?#if?you've?seen?this?tag?before? ?
  79. ????????????if(is_array($this->parent[$tag])?and?array_key_exists(0,$this->parent[$tag])){?#if?the?keys?are?numeric? ?
  80. ????????????????#this?is?the?third?or?later?instance?of?$tag?we've?come?across? ??
  81. ????????????????$key?=?count_numeric_items($this->parent[$tag]);? ??
  82. ????????????}else{? ??
  83. ????????????????#this?is?the?second?instance?of?$tag?that?we've?seen.?shift?around? ?
  84. ????????????????if(array_key_exists("$tag?attr",$this->parent)){? ?
  85. ????????????????????$arr?=?array('0?attr'=>&$this->parent["$tag?attr"],?&$this->parent[$tag]);? ?
  86. ????????????????????unset($this->parent["$tag?attr"]);? ?
  87. ????????????????}else{? ?
  88. ????????????????????$arr?=?array(&$this->parent[$tag]);? ?
  89. ????????????????}? ?
  90. ????????????????$this->parent[$tag]?=?&$arr;? ?
  91. ????????????????$key?=?1;? ?
  92. ????????????}? ?
  93. ????????????$this->parent?=?&$this->parent[$tag];? ?
  94. ????????}else{? ?
  95. ????????????$key?=?$tag;? ?
  96. ????????}? ?
  97. ????????if($attributes)?$this->parent["$key?attr"]?=?$attributes;? ?
  98. ????????$this->parent??=?&$this->parent[$key];? ?
  99. ????????$this->stack[]?=?&$this->parent;? ?
  100. ????}? ?
  101. ????function?data(&$parser,?$data){? ?
  102. ????????if($this->last_opened_tag?!=?NULL)?#you?don't?need?to?store?whitespace?in?between?tags? ??
  103. ????????????$this->data?.=?$data;? ??
  104. ????}? ??
  105. ????function?close(&$parser,?$tag){? ??
  106. ????????if($this->last_opened_tag?==?$tag){? ??
  107. ????????????$this->parent?=?$this->data;? ??
  108. ????????????$this->last_opened_tag?=?NULL;? ??
  109. ????????}? ??
  110. ????????array_pop($this->stack);? ??
  111. ????????if($this->stack)?$this->parent?=?&$this->stack[count($this->stack)-1];? ??
  112. ????}? ??
  113. }? ??
  114. function?count_numeric_items(&$array){? ??
  115. ????return?is_array($array)???count(array_filter(array_keys($array),?'is_numeric'))?:?0;? ??
  116. }? ??
  117. ?>? ??

?

http://blog.s135.com/post/253/?转载

发表评论
用户名: 匿名