您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹有哪些php中xml轉換json的方法,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
php中xml轉換json的方法:首先需要使用SimpleXMLElement將XML內容轉化成適當的PHP數據類型;然后將PHP數據提供給【Services_JSON】編碼器;最后生成最終的JSON格式的輸出即可。
php中xml轉換json的方法:
越來越多的應用程序需要將 XML 轉換成 JSON。已經出現了一些基于 Web 的服務來執行這類轉換。IBM T.J. Watson Research Center 開發了一種專門的方法,使用 PHP 進行這種轉換。該方法以 XML 字符串數據為輸入并將其轉換成 JSON 格式的數據輸出。這種 PHP 的解決方案有以下幾方面的優點:
可以獨立模式運行,在命令行下執行。
可以包含到已有服務器端代碼工件中。
很容易承載為 Web 上的 Web 服務。
XML 到 JSON 的轉換需要用到兩種 PHP 核心特性:
SimpleXMLElement
Services_JSON
只需要這兩種 PHP 核心特性,就可以將任何 XML 數據轉化成 JSON。首先,需要使用 SimpleXMLElement 將 XML 內容轉化成適當的 PHP 數據類型。然后將 PHP 數據提供給 Services_JSON 編碼器,后者再生成最終的 JSON 格式的輸出。
理解 PHP 代碼
這個 xml2json 實現包括三部分:
xml2json.php —— 這個 PHP 類包括兩個靜態函數
xml2json_test.php —— 執行xml2json 轉換函數的測試驅動程序
test1.xml、test2.xml、test3.xml、test4.xml —— 復雜程度不同的 XML 文件
為了簡化起見,本文省略了代碼中的詳細注釋。不過后面附的源文件中包含完整的注釋。要了解完全的程序邏輯細節,請參閱所附的源文件(請參閱下載)。
(1)定義了一些要用到的常量。第一行代碼導入了 Services_JSON 實現。
(1)定義 xml2json.php
中的常量
require_once 'json/JSON.php'; // Internal program-specific Debug option. define ("DEBUG", false); // Maximum Recursion Depth that we can allow. define ("MAX_RECURSION_DEPTH_ALLOWED", 25); // An empty string define ("EMPTY_STR", ""); // SimpleXMLElement object property name for attributes define ("SIMPLE_XML_ELEMENT_OBJECT_PROPERTY_FOR_ATTRIBUTES", "@attributes"); // SimpleXMLElement object name. define ("SIMPLE_XML_ELEMENT_PHP_CLASS", "SimpleXMLElement");
(2)中的代碼片段是 xml2json 轉換器的入口函數。它接收 XML 數據作為輸入,將 XML 字符串轉化成 SimpleXMLElement 對象,然后發送給該類的另一個(遞歸)函數作為輸入。這個函數將 XML 元素轉化成 PHP 關聯數組。這個數組再被傳給 Services_JSON 編碼器作為其輸入,該編碼器給出 JSON 格式的輸出。
(2)使用 xml2json.php
中的 Services_JSON
public static function transformXmlStringToJson($xmlStringContents) { $simpleXmlElementObject = simplexml_load_string($xmlStringContents); <br> if ($simpleXmlElementObject == null) { return(EMPTY_STR); } <br> $jsonOutput = EMPTY_STR; <br> // Let us convert the XML structure into PHP array structure. $array1 = xml2json::convertSimpleXmlElementObjectIntoArray($simpleXmlElementObject); <br> if (($array1 != null) && (sizeof($array1) > 0)) { // Create a new instance of Services_JSON $json = new Services_JSON(); // Let us now convert it to JSON formatted data. $jsonOutput = $json->encode($array1); } // End of if (($array1 != null) && (sizeof($array1) > 0)) <br> return($jsonOutput); } // End of function transformXmlStringToJson
(3)這段長長的代碼片段采用了 PHP 開放源碼社區(請參閱參考資料)提出的遞歸技術。它接收輸入的 SimpleXMLElement 對象,沿著嵌套的 XML 樹遞歸遍歷。將訪問過的 XML 元素保存在 PHP 關聯數組中。可以通過修改4中定義的常量來改變最大遞歸深度。
(3)xml2json.php
中的轉換邏輯
public static function convertSimpleXmlElementObjectIntoArray($simpleXmlElementObject, &$recursionDepth=0) { // Keep an eye on how deeply we are involved in recursion. <br> if ($recursionDepth > MAX_RECURSION_DEPTH_ALLOWED) { // Fatal error. Exit now. return(null); } <br> if ($recursionDepth == 0) { if (get_class($simpleXmlElementObject) != SIMPLE_XML_ELEMENT_PHP_CLASS) { // If the external caller doesn't call this function initially // with a SimpleXMLElement object, return now. return(null); } else { // Store the original SimpleXmlElementObject sent by the caller. // We will need it at the very end when we return from here for good. $callerProvidedSimpleXmlElementObject = $simpleXmlElementObject; } } // End of if ($recursionDepth == 0) { <br> if (get_class($simpleXmlElementObject) == SIMPLE_XML_ELEMENT_PHP_CLASS) { // Get a copy of the simpleXmlElementObject $copyOfsimpleXmlElementObject = $simpleXmlElementObject; // Get the object variables in the SimpleXmlElement object for us to iterate. $simpleXmlElementObject = get_object_vars($simpleXmlElementObject); } <br> // It needs to be an array of object variables. if (is_array($simpleXmlElementObject)) { // Is the array size 0? Then, we reached the rare CDATA text if any. if (count($simpleXmlElementObject) <= 0) { // Let us return the lonely CDATA. It could even be // an empty element or just filled with whitespaces. return (trim(strval($copyOfsimpleXmlElementObject))); } <br> // Let us walk through the child elements now. foreach($simpleXmlElementObject as $key=>$value) { // When this block of code is commented, XML attributes will be // added to the result array. // Uncomment the following block of code if XML attributes are // NOT required to be returned as part of the result array. /* if($key == SIMPLE_XML_ELEMENT_OBJECT_PROPERTY_FOR_ATTRIBUTES) { continue; } */ <br> // Let us recursively process the current element we just visited. // Increase the recursion depth by one. $recursionDepth++; $resultArray[$key] = xml2json::convertSimpleXmlElementObjectIntoArray($value, $recursionDepth); <br> // Decrease the recursion depth by one. $recursionDepth--; } // End of foreach($simpleXmlElementObject as $key=>$value) { <br> if ($recursionDepth == 0) { // That is it. We are heading to the exit now. // Set the XML root element name as the root [top-level] key of // the associative array that we are going to return to the caller of this // recursive function. $tempArray = $resultArray; $resultArray = array(); $resultArray[$callerProvidedSimpleXmlElementObject->getName()] = $tempArray; } <br> return ($resultArray); } else { // We are now looking at either the XML attribute text or // the text between the XML tags. return (trim(strval($simpleXmlElementObject))); } // End of else } // End of function convertSimpleXmlElementObjectIntoArray.
成功遍歷 XML 樹之后,該函數就用 PHP 關聯數組轉換和存儲了所有的 XML 元素(根元素和所有的孩子元素)。復雜的 XML 文檔,得到的 PHP 數組也同樣復雜。一旦 PHP 數組構造完成,Services_JSON 編碼器就很容易將其轉化成 JSON 格式的數據了。要了解其中的遞歸邏輯,請參閱存檔的源文件。
xml2json 測試驅動程序的實現
(4)中的代碼片段是一個用于執行 xml2json 轉換器邏輯的測試驅動程序。
(4)xml2json_test.php
<?php require_once("xml2json.php"); <br> // Filename from where XML contents are to be read. $testXmlFile = ""; <br> // Read the filename from the command line. if ($argc <= 1) { print("Please provide the XML filename as a command-line argument:\n"); print("\tphp -f xml2json_test.php test1.xml\n"); return; } else { $testXmlFile = $argv[1]; } <br> //Read the XML contents from the input file. file_exists($testXmlFile) or die('Could not find file ' . $testXmlFile); $xmlStringContents = file_get_contents($testXmlFile); <br> $jsonContents = ""; // Convert it to JSON now. // xml2json simply takes a String containing XML contents as input. $jsonContents = xml2json::transformXmlStringToJson($xmlStringContents); <br> echo("JSON formatted output generated by xml2json:\n\n"); echo($jsonContents); ?>
可以在命令行中運行該程序,輸入以下 XML 文件名作為命令行參數:
php -f xml2json_test.php test2.xml
在命令行中執行的時候,該程序將 XML 內容從文件讀入一個字符串變量。然后調用 xml2json 類中的靜態函數得到 JSON 格式的結果。除了從命令行中運行該程序之外,還可以修改這個源文件中的邏輯來公開 xml2json 轉換器,將其作為可使用簡單對象訪問協議(SOAP)或者 Representational State Transfer (REST) 訪問協議來遠程調用的 Web 服務。如果需要,在 PHP 中只要稍加修改就能實現此遠程調用。
(5)展示了本文提供的四個測試 XML 文件中的一個,這些文件用于測試 xml2json 實現。他們的復雜度各不相同。可以將這些文件作為命令行參數傳遞給測試驅動程序 xml2json_test.php。
(5)用 test2.xml 測試 xml2json 實現
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="1"> <title>Code Generation in Action</title> <author><first>Jack</first><last>Herrington</last></author> <publisher>Manning</publisher> </book> <br> <book id="2"> <title>PHP Hacks</title> <author><first>Jack</first><last>Herrington</last></author> <publisher>O'Reilly</publisher> </book> <br> <book id="3"> <title>Podcasting Hacks</title> <author><first>Jack</first><last>Herrington</last></author> <publisher>O'Reilly</publisher> </book> </books>
(6)中所示的代碼片段是,使用 test2.xml 作為測試驅動程序 xml2json_test.php 的命令行參數時得到的 JSON 格式結果。
(6)test2.xml 的 JSON 格式化結果
{ "books" : { "book" : [ { "@attributes" : { "id" : "1" }, "title" : "Code Generation in Action", "author" : { "first" : "Jack", "last" : "Herrington" }, "publisher" : "Manning" }, { "@attributes" : { "id" : "2" }, "title" : "PHP Hacks", "author" : { "first" : "Jack", "last" : "Herrington" }, "publisher" : "O'Reilly" }, { "@attributes" : { "id" : "3" }, "title" : "Podcasting Hacks", "author" : { "first" : "Jack", "last" : "Herrington" }, "publisher" : "O'Reilly" } ]} }
請注意,<book> 元素的 XML 屬性 id 作為 "@attributes" 對象的屬性被保存在 JSON 數據中,<book> 元素作為對象數組被保存在 JSON 數據中。JSON 輸出易于在 JavaScript 代碼中使用 eval 語句進行處理。
關于有哪些php中xml轉換json的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。