XMLから配列オブジェクトへ

WBOY
WBOYオリジナル
2016-07-25 09:05:071131ブラウズ
XML コンテンツを解析した後、対応する配列オブジェクトが返され、戻り値の型はパラメーター設定 [配列、JSON] によって設定できます。デフォルト: 配列
simplexml_load_string に基づいているため、名前空間を含む XML の解析があまり得意ではなく、名前空間の内容が失われます。 上記はテストで得られた結論であり、以降のバージョンではこの問題が解決されます。
これは一般的な使用要件を満たすことができます
  1. 関数 toJSON()
  2. {
  3. require_once '../classes/XmlToArray.php';
  4. $XML=<<&XML
  5. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  6. "http://struts.apache.org/dtds/struts-2.0.dtd"> ;
  7. add.action
  8. /emp/add_suc.jsp
  9. /emp/list.jsp
  10. < ;result>delete.action
  11. /emp/delete_suc.jsp
  12. update.action
  13. /emp/edit_suc.jsp
  14. /emp/edit.jsp
  15. XML;
  16. header("Content-type: text/html; charset=utf-8") ;
  17. $xml_to_array = new XmlToArray();
  18. $xml_to_array->setXml($XML);
  19. //現在标签名が内部設置プロパティにあるとき突発的な時期は、関連するプロパティ名を自動的に決定できます、一般その概要不要です
  20. //$xml_to_array->setAttributeAsName("attributeAsName")->setContentAsName("contentasName");
  21. $r = $xml_to_array->parseXml(true);
  22. print_r( $r ) ;
  23. }
  24. // 打印结果:
  25. {"struts":{"attributes":[],"content":"","constant":{"attributes":{"name":"struts.objectFactory", "value":"spring"},"content":""},"package":{"attributes":{"name":"crm_employee","extends":"struts-default","namespace":" /emp"},"コンテンツ":"","アクション":[{"属性":{"名前":"追加","クラス":"addBean","メソッド":"追加"},"コンテンツ":"","re​​sult":[{"attributes":[],"content":"add.action"},{"attributes":[],"content":"/emp/add_suc.jsp"} ]},{"属性":{"名前":"リスト","クラス":"リストBean","メソッド":"リスト"},"コンテンツ":"","結果":{"属性": [],"コンテンツ":"/emp/list.jsp"}},{"属性":{"名前":"削除","クラス":"deleteBean","メソッド":"削除"}," content":"","re​​sult":{"attributes":[],"content":"/emp/delete_suc.jsp"}},{"attributes":{"name":"update","class" :"updateBean","メソッド":"更新"},"コンテンツ":"","結果":{"属性":[],"コンテンツ":"/emp/edit_suc.jsp"}},{"属性":{"名前":"編集","クラス":"editBean","メソッド":"編集"},"コンテンツ":"","結果":{"属性":[],"コンテンツ":"/emp/edit.jsp"}}]}}}
  26. // 打印数组
  27. function toArray()
  28. {
  29. require_once '../classes/XmlToArray.php';
  30. $XML=<<
  31. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  32. "http://struts.apache.org/dtds/struts-2.0.dtd ">
  33. <パッケージ名="crm_employee" extends="struts-default" namespace="/emp">
  34. <アクション名="add" class="addBean" メソッド=" add">
  35. add.action
  36. /emp/add_suc.jsp
  37. /emp/list.jsp
  38. delete.action
  39. /emp/delete_suc.jsp
  40. update.action
  41. /emp/edit_suc.jsp
  42. /emp/edit.jsp
  43. < ;/struts>
  44. XML;
  45. header("Content-type: text/html; charset=utf-8") ;
  46. $xml_to_array = new XmlToArray();
  47. $xml_to_array->setXml($XML);
  48. //現在标签名が内部設置プロパティにあるとき突発的な時期は、関連するプロパティ名を自動的に決定できます、一般その概要不要です
  49. //$xml_to_array->setAttributeAsName("attributeAsName")->setContentAsName("contentasName");
  50. $r = $xml_to_array->parseXml();
  51. print_r( $r ) ;
  52. }
  53. // 打印结果
  54. Array
  55. (
  56. [struts] =>Array
  57. (
  58. [attributes] =>Array
  59. (
  60. )
  61. [content] =>gt;
  62. [constant] => Array
  63. (
  64. [属性] => 配列
  65. (
  66. [名前] => struts.objectFactory
  67. [値] => spring
  68. )
  69. [内容] =>
  70. )
  71. [パッケージ] => 配列
  72. (
  73. [属性] => 配列
  74. (
  75. [名前] => crm_employee
  76. [拡張] => struts-default
  77. [名前空間] => /emp
  78. )
  79. [内容] =>
  80. [アクション] => 配列
  81. (
  82. [0] => 配列
  83. (
  84. [属性] => Array
  85. (
  86. [名前] => add
  87. [クラス] => addBean
  88. [メソッド] => add
  89. )
  90. [内容] =>
  91. [結果] =>配列
  92. (
  93. [0] => 配列
  94. (
  95. [属性] => 配列
  96. (
  97. )
  98. [コンテンツ] => add.action
  99. )
  100. [1] => 配列
  101. (
  102. [属性] => 配列
  103. (
  104. )
  105. [内容] => /emp/add_suc.jsp
  106. )
  107. )
  108. )
  109. [1] => Array
  110. (
  111. [属性] => Array
  112. (
  113. [名前] => list
  114. [クラス] => listBean
  115. [メソッド] => list
  116. )
  117. [内容] =>
  118. [結果] => 配列
  119. (
  120. [属性] => 配列
  121. (
  122. )
  123. [内容] => /emp/list.jsp
  124. )
  125. )
  126. [2] => Array
  127. (
  128. [属性] => Array
  129. (
  130. [名前] => delete
  131. [クラス] => deleteBean
  132. [メソッド] => delete
  133. )
  134. [内容] =>
  135. [結果] => 配列
  136. (
  137. [属性] => 配列
  138. (
  139. )
  140. [内容] => /emp/delete_suc.jsp
  141. )
  142. )
  143. [3] =>配列
  144. (
  145. [属性] => 配列
  146. (
  147. [名前] =>更新
  148. [クラス] => updateBean
  149. [メソッド] =>更新
  150. )
  151. [内容] =>
  152. [結果] =>配列
  153. (
  154. [属性] => 配列
  155. (
  156. )
  157. [内容] => /emp/edit_suc.jsp
  158. )
  159. )
  160. [4] => Array
  161. (
  162. [属性] => Array
  163. (
  164. [名前] => edit
  165. [クラス] => editBean
  166. [メソッド] => edit
  167. )
  168. [内容] =>
  169. [結果] => 配列
  170. (
  171. [属性] => 配列
  172. (
  173. )
  174. [内容] => /emp/edit.jsp
  175. )
  176. )
  177. )
  178. )
  179. )
  180. )
复制代
  1. /**
  2. * JetBrains PhpStorm によって作成されました。
  3. * ユーザー: hedgehog
  4. * 日付: 12-5-9
  5. * 時刻: 午後 4 時 37 分
  6. * このテンプレートを変更するには、ファイル | を使用します。設定 |ファイルテンプレート
  7. */
  8. class XmlToArray
  9. {
  10. private $xml;
  11. private $contentAsName="content" ;
  12. private $attributesAsName="attributes";
  13. private $xml_array = array();
  14. public function setXml( $xmlstr )
  15. {
  16. $this->xml = $xmlstr ;
  17. return $this ;
  18. }
  19. public function setContentAsName( $name )
  20. {
  21. $this-> contentAsName = $name ;
  22. return $this ;
  23. }
  24. public function setAttributeAsName( $name )
  25. {
  26. $this->attributesAsName = $name ;
  27. return $this ;
  28. }
  29. private function createXMLArray( $node, &$parent_node,$node_index =0)
  30. {
  31. $node_attrbutes= array() ;
  32. $node_name = $node->getName() ;
  33. $attributes = $node->attributes() ;
  34. $children = $ node->children () ;
  35. // 遍歴点上のすべてのプロパティ
  36. foreach( $attributes as $attrname => $attrvalue )
  37. {
  38. $attrvalue = ( string )$attrvalue ;
  39. $node_attrbutes[ $ attrname ] = トリム( $attrvalue ) ;
  40. }
  41. $content = "";
  42. if( count($children) == 0 )
  43. {
  44. $content = ( string ) $node ;
  45. }
  46. $node_array = 配列(
  47. $this->gt;attributesAsName =>$node_attrbutes ,
  48. $this->gt;contentAsName =>トリム( $content )
  49. );
  50. // 配置层级关系
  51. if( !isset( $parent_node[ $node_name ] ) )
  52. {
  53. $is = count( $parent_node ) ;
  54. if( !isset( $parent_node[ $ this->attributesAsName ] ) && count( $parent_node ) > 0 )
  55. {
  56. $last_index = count( $parent_node ) -1 ;
  57. $parent_node =& $parent_node[ $last_index ];
  58. $parent_node[ $node_name ] = $node_array ;
  59. }
  60. else
  61. {
  62. $parent_node[ $node_name ] = $node_array ;
  63. }
  64. }
  65. else
  66. {
  67. $append = &$parent_node[ $node_name ] ;
  68. if( isset( $append[ $this->attributesAsName ] ) )
  69. {
  70. $parent_node[ $node_name ] = array( $append );
  71. $append = &$parent_node[ $node_name ] ;
  72. }
  73. if( isset( $append[ $node_index ] ) )
  74. {
  75. $append = &$append[ $node_index ] ;
  76. }
  77. // 追加
  78. array_push( $append , $node_array ) ;
  79. }
  80. $index = 0 ;
  81. // 递归操作
  82. foreach( $children as $childnode )
  83. {
  84. $parent = &$parent_node[ $node_name ] ;
  85. $this->createXMLArray( $childnode ,$parent,$index ++ );
  86. }
  87. return $parent_node ;
  88. }
  89. public function parseXml( $isjson=false)
  90. {
  91. $root = simplexml_load_string ( $this->gt;xml ) ;
  92. $parent_node = array();
  93. $array = $this->createXMLArray( $root ,$parent_node ) ;
  94. $isjson を返しますか? json_encode( $array ) : $array ;
  95. }
  96. }
复制代码


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。