中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

php中xml轉換json問題

php中xml轉換json的方法:首先需要使用SimpleXMLElement將XML內容轉化成適當的PHP數據類型;然后將PHP數據提供給【Services_JSON】編碼器;最后生成最終的JSON格式的輸出即可。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:空間域名、虛擬主機、營銷軟件、網站建設、南鄭網站維護、網站推廣。

php中xml轉換json的方法:

越來越多的應用程序需要將 XML 轉換成 JSON。已經出現了一些基于 Web 的服務來執(zhí)行這類轉換。IBM T.J. Watson Research Center 開發(fā)了一種專門的方法,使用 PHP 進行這種轉換。該方法以 XML 字符串數據為輸入并將其轉換成 JSON 格式的數據輸出。這種 PHP 的解決方案有以下幾方面的優(yōu)點:

可以獨立模式運行,在命令行下執(zhí)行。

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

很容易承載為 Web 上的 Web 服務。

XML 到 JSON 的轉換需要用到兩種 PHP 核心特性:

SimpleXMLElement

Services_JSON

只需要這兩種 PHP 核心特性,就可以將任何 XML 數據轉化成 JSON。首先,需要使用 SimpleXMLElement 將 XML 內容轉化成適當的 PHP 數據類型。然后將 PHP 數據提供給 Services_JSON 編碼器,后者再生成最終的 JSON 格式的輸出。

理解 PHP 代碼

這個 xml2json 實現包括三部分:

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

xml2json_test.php —— 執(zhí)行xml2json 轉換函數的測試驅動程序

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

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

(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 對象,然后發(fā)送給該類的另一個(遞歸)函數作為輸入。這個函數將 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 開放源碼社區(qū)(請參閱參考資料)提出的遞歸技術。它接收輸入的 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)中的代碼片段是一個用于執(zhí)行 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

在命令行中執(zhí)行的時候,該程序將 XML 內容從文件讀入一個字符串變量。然后調用 xml2json 類中的靜態(tài)函數得到 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問題
文章URL:http://www.rwnh.cn/article12/cgcidc.html

成都網站建設公司_創(chuàng)新互聯,為您提供搜索引擎優(yōu)化、外貿建站、網站導航、云服務器、品牌網站設計營銷型網站建設

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

網站托管運營
阜平县| 巴塘县| 临邑县| 莱芜市| 江都市| 怀化市| 彭山县| 绥滨县| 济源市| 阳城县| 金沙县| 海晏县| 丹棱县| 始兴县| 曲麻莱县| 大邑县| 石河子市| 南投县| 遵义县| 凤阳县| 博白县| 卫辉市| 孟村| 瑞金市| 涞源县| 精河县| 古丈县| 天门市| 金坛市| 正蓝旗| 喜德县| 西贡区| 团风县| 成安县| 内丘县| 凭祥市| 扶沟县| 宜昌市| 漳平市| 故城县| 白水县|