真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

php中xml轉(zhuǎn)換json問(wèn)題

php中xml轉(zhuǎn)換json的方法:首先需要使用SimpleXMLElement將XML內(nèi)容轉(zhuǎn)化成適當(dāng)?shù)腜HP數(shù)據(jù)類(lèi)型;然后將PHP數(shù)據(jù)提供給【Services_JSON】編碼器;最后生成最終的JSON格式的輸出即可。

讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、虛擬主機(jī)、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、南鄭網(wǎng)站維護(hù)、網(wǎng)站推廣。

php中xml轉(zhuǎn)換json的方法:

越來(lái)越多的應(yīng)用程序需要將 XML 轉(zhuǎn)換成 JSON。已經(jīng)出現(xiàn)了一些基于 Web 的服務(wù)來(lái)執(zhí)行這類(lèi)轉(zhuǎn)換。IBM T.J. Watson Research Center 開(kāi)發(fā)了一種專(zhuān)門(mén)的方法,使用 PHP 進(jìn)行這種轉(zhuǎn)換。該方法以 XML 字符串?dāng)?shù)據(jù)為輸入并將其轉(zhuǎn)換成 JSON 格式的數(shù)據(jù)輸出。這種 PHP 的解決方案有以下幾方面的優(yōu)點(diǎn):

可以獨(dú)立模式運(yùn)行,在命令行下執(zhí)行。

可以包含到已有服務(wù)器端代碼工件中。

很容易承載為 Web 上的 Web 服務(wù)。

XML 到 JSON 的轉(zhuǎn)換需要用到兩種 PHP 核心特性:

SimpleXMLElement

Services_JSON

只需要這兩種 PHP 核心特性,就可以將任何 XML 數(shù)據(jù)轉(zhuǎn)化成 JSON。首先,需要使用 SimpleXMLElement 將 XML 內(nèi)容轉(zhuǎn)化成適當(dāng)?shù)?PHP 數(shù)據(jù)類(lèi)型。然后將 PHP 數(shù)據(jù)提供給 Services_JSON 編碼器,后者再生成最終的 JSON 格式的輸出。

理解 PHP 代碼

這個(gè) xml2json 實(shí)現(xiàn)包括三部分:

xml2json.php —— 這個(gè) PHP 類(lèi)包括兩個(gè)靜態(tài)函數(shù)

xml2json_test.php —— 執(zhí)行xml2json 轉(zhuǎn)換函數(shù)的測(cè)試驅(qū)動(dòng)程序

test1.xml、test2.xml、test3.xml、test4.xml —— 復(fù)雜程度不同的 XML 文件

為了簡(jiǎn)化起見(jiàn),本文省略了代碼中的詳細(xì)注釋。不過(guò)后面附的源文件中包含完整的注釋。要了解完全的程序邏輯細(xì)節(jié),請(qǐng)參閱所附的源文件(請(qǐng)參閱下載)。

(1)定義了一些要用到的常量。第一行代碼導(dǎo)入了 Services_JSON 實(shí)現(xiàn)。

(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 轉(zhuǎn)換器的入口函數(shù)。它接收 XML 數(shù)據(jù)作為輸入,將 XML 字符串轉(zhuǎn)化成 SimpleXMLElement 對(duì)象,然后發(fā)送給該類(lèi)的另一個(gè)(遞歸)函數(shù)作為輸入。這個(gè)函數(shù)將 XML 元素轉(zhuǎn)化成 PHP 關(guān)聯(lián)數(shù)組。這個(gè)數(shù)組再被傳給 Services_JSON 編碼器作為其輸入,該編碼器給出 JSON 格式的輸出。

(2)使用 xml2json.php中的 Services_JSON

public static function transformXmlStringToJson($xmlStringContents) {
 $simpleXmlElementObject = simplexml_load_string($xmlStringContents); 

if ($simpleXmlElementObject == null) { return(EMPTY_STR); }
$jsonOutput = EMPTY_STR;
// Let us convert the XML structure into PHP array structure. $array1 = xml2json::convertSimpleXmlElementObjectIntoArray($simpleXmlElementObject);
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))
return($jsonOutput); } // End of function transformXmlStringToJson

(3)這段長(zhǎng)長(zhǎng)的代碼片段采用了 PHP 開(kāi)放源碼社區(qū)(請(qǐng)參閱參考資料)提出的遞歸技術(shù)。它接收輸入的 SimpleXMLElement 對(duì)象,沿著嵌套的 XML 樹(shù)遞歸遍歷。將訪(fǎng)問(wèn)過(guò)的 XML 元素保存在 PHP 關(guān)聯(lián)數(shù)組中。可以通過(guò)修改4中定義的常量來(lái)改變遞歸深度。

(3)xml2json.php中的轉(zhuǎn)換邏輯

public static function convertSimpleXmlElementObjectIntoArray($simpleXmlElementObject,
&$recursionDepth=0) {
 // Keep an eye on how deeply we are involved in recursion.

if ($recursionDepth > MAX_RECURSION_DEPTH_ALLOWED) { // Fatal error. Exit now. return(null); }
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) {
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); }
// 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))); }
// 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; } */
// Let us recursively process the current element we just visited. // Increase the recursion depth by one. $recursionDepth++; $resultArray[$key] = xml2json::convertSimpleXmlElementObjectIntoArray($value, $recursionDepth);
// Decrease the recursion depth by one. $recursionDepth--; } // End of foreach($simpleXmlElementObject as $key=>$value) {
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; }
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 樹(shù)之后,該函數(shù)就用 PHP 關(guān)聯(lián)數(shù)組轉(zhuǎn)換和存儲(chǔ)了所有的 XML 元素(根元素和所有的孩子元素)。復(fù)雜的 XML 文檔,得到的 PHP 數(shù)組也同樣復(fù)雜。一旦 PHP 數(shù)組構(gòu)造完成,Services_JSON 編碼器就很容易將其轉(zhuǎn)化成 JSON 格式的數(shù)據(jù)了。要了解其中的遞歸邏輯,請(qǐng)參閱存檔的源文件。

xml2json 測(cè)試驅(qū)動(dòng)程序的實(shí)現(xiàn)

(4)中的代碼片段是一個(gè)用于執(zhí)行 xml2json 轉(zhuǎn)換器邏輯的測(cè)試驅(qū)動(dòng)程序。

(4)xml2json_test.php


    // Filename from where XML contents are to be read.
    $testXmlFile = "";

// 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]; }
//Read the XML contents from the input file. file_exists($testXmlFile) or die('Could not find file ' . $testXmlFile); $xmlStringContents = file_get_contents($testXmlFile);
$jsonContents = ""; // Convert it to JSON now. // xml2json simply takes a String containing XML contents as input. $jsonContents = xml2json::transformXmlStringToJson($xmlStringContents);
echo("JSON formatted output generated by xml2json:\\n\\n"); echo($jsonContents); ?>

可以在命令行中運(yùn)行該程序,輸入以下 XML 文件名作為命令行參數(shù):

php -f xml2json_test.php test2.xml

在命令行中執(zhí)行的時(shí)候,該程序?qū)?XML 內(nèi)容從文件讀入一個(gè)字符串變量。然后調(diào)用 xml2json 類(lèi)中的靜態(tài)函數(shù)得到 JSON 格式的結(jié)果。除了從命令行中運(yùn)行該程序之外,還可以修改這個(gè)源文件中的邏輯來(lái)公開(kāi) xml2json 轉(zhuǎn)換器,將其作為可使用簡(jiǎn)單對(duì)象訪(fǎng)問(wèn)協(xié)議(SOAP)或者 Representational State Transfer (REST) 訪(fǎng)問(wèn)協(xié)議來(lái)遠(yuǎn)程調(diào)用的 Web 服務(wù)。如果需要,在 PHP 中只要稍加修改就能實(shí)現(xiàn)此遠(yuǎn)程調(diào)用。

(5)展示了本文提供的四個(gè)測(cè)試 XML 文件中的一個(gè),這些文件用于測(cè)試 xml2json 實(shí)現(xiàn)。他們的復(fù)雜度各不相同??梢詫⑦@些文件作為命令行參數(shù)傳遞給測(cè)試驅(qū)動(dòng)程序 xml2json_test.php。

(5)用 test2.xml 測(cè)試 xml2json 實(shí)現(xiàn)



    
        Code Generation in Action
        JackHerrington
        Manning
    

PHP Hacks JackHerrington O'Reilly
Podcasting Hacks JackHerrington O'Reilly

(6)中所示的代碼片段是,使用 test2.xml 作為測(cè)試驅(qū)動(dòng)程序 xml2json_test.php 的命令行參數(shù)時(shí)得到的 JSON 格式結(jié)果。

(6)test2.xml 的 JSON 格式化結(jié)果

{
 "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"
 }
 ]}
}

請(qǐng)注意, 元素的 XML 屬性 id 作為 "@attributes" 對(duì)象的屬性被保存在 JSON 數(shù)據(jù)中, 元素作為對(duì)象數(shù)組被保存在 JSON 數(shù)據(jù)中。JSON 輸出易于在 JavaScript 代碼中使用 eval 語(yǔ)句進(jìn)行處理。
本文題目:php中xml轉(zhuǎn)換json問(wèn)題
URL地址:http://weahome.cn/article/cgcidc.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部