PHP 使用 SimpleXML 來解析 XML 內容、屬性

PHP 可以使用 simplexml_load_stringsimplexml_load_file 來解析 XML, 以取得內容.

程式 與 XML 內容


<?php
$string = <<<XML
<?xml version='1.0'?>
<document responsecode="200">
  <result count="10" start="0" totalhits="133047950">
    <title>Test</title>
    <from>Jon</from>
    <to>Tsung</to>
  </result>
</document>
XML;
 
$xml = simplexml_load_string($string);
print_r($xml);
?>

XML 解析 的 內容會回傳一個物件


SimpleXMLElement Object
(
    [@attributes] => Array
    (
       [responsecode] => 200
    )
 
    [result] => SimpleXMLElement Object
    (
        [@attributes] => Array
        (
            [count] => 10
            [start] => 0
            [totalhits] => 13304
        )
 
       [title] => Test
       [from] => Jon
       [to] => Tsung
    )
)

如何取用此物件回傳的值

取得 result 下的 title
  • $xml->result->title; // Test (object)
  • 建議: (string)$xml->result->title; // 強迫轉換成字串
取得屬性的值(@attributes)
  • $xml->result->attributes()->totalhits; // 13304 (object), 一樣建議於前面加 (string)
  • $result_attr = $xml->result->attributes();
    $result_attr['totalhits']; // 13304 (object), 一樣建議於前面加 (string)

關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming。將永久鏈結加入書籤。

PHP 使用 SimpleXML 來解析 XML 內容、屬性 有 16 則回應

  1. 阿凱 說道:

    像是 $xml->result->title; 取回的資料會是 SimpleXML 的物件..並非 String 或是 Int ...
    有時候在傳入其他參數或是 mysql 的時候, 最好要強迫型態轉換.

  2. Tsung 說道:

    感恩, 我沒注意到居然是 object, 馬上補上~ 🙂

  3. 富爸爸水電工 說道:

    您好:
    我可以請教您一個關於如何將xml的資料,匯入mysql的資料庫的問題嗎?

  4. Tsung 說道:

    把 XML parse 成 array, 再寫個 foreach 寫入 MySQL 就好了呀. 🙂

  5. 富爸爸水電工 說道:

    您好:
    如果,我可以給我將檔案寄給您,您可以幫我將如何做,才能把這個xml檔,匯入sql的的操作說明,錄製成操作錄影檔嗎?
    需要多少費用?
    我的msn:ut5591066@hotmail.com
    skype:ut5553616 富爸爸水電工

  6. Tsung 說道:

    你先寄一部份 XML 和要 匯入DB 的 schema 給我看看?
    順便問問這個的用途是? 商用? or ?

  7. 富爸爸水電工 說道:

    我先把xml寄給您。
    我是要做商品目錄,做成產品鏈結,幫廠商賣產品,賣出去就可以抽佣金。(類似通路王)
    因為,廠商的產品太多了,而且廠商有提供xml檔。
    至於資料庫,因為,我目前是用osc的。
    如果,用osc的不好做,可以另外開一個新的資料庫。

  8. Tsung 說道:

    Blog 左邊列有 My Mail, 可以先寄一些讓我看看, 還有要對應哪些欄位等等.

  9. chung 說道:

    您好~我想請教
    如果我透過post的方式取得遠端xml的值 然後使用
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 3); //times out after 4s
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

    curl_setopt($ch,CURLOPT_POST,count($fields));
    curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
    $result=curl_exec($ch);
    print_r($result);
    的方式

    輸出的值會是 張先生chung@aaa.com台北市松山區......這樣黏在一起
    請問我該如何各別取得變數植呢?
    例如 $name="張先生";
    $email="chung@aaa.com";

    不知道前輩是不是可以幫我解答?
    感謝

    • Tsung 說道:

      依照你最前面講得 "取得遠端xml的值", 那你現在的 $result 應該是 XML, 而不是連在一起的字串.

      print_r(simplexml_load_string($result));

      就可以了. 🙂

    • chung 說道:

      前輩 使用了您說的方法 是可以列出所有的值 如下列
      SimpleXMLElement Object ( [errorCode] => SimpleXMLElement Object ( ) [userLoginStatus] => true [userAccount] => chung@teme.biz [userId] => 127081 [userName] => 張先生 [userNickname] => chung [userTel] => 02-27658888 [userMobile] => 0920-555-265

      但如果我想要取得單獨欄位值我該怎麼下指令
      例如我只想要得到[userNickname]

      抱歉問了好像很笨的問題...
      但還有希望前輩能夠給予指導

      不勝感激

    • Tsung 說道:

      $x = simple...($result);
      echo $x->userNickname;
      這些已經是基本能力了, 建議您在加強點基礎. 🙂

    • chung 說道:

      謝謝前輩...我會的..感謝

  10. chung 說道:

    再次謝謝前輩~

  11. 說道:

    对象直接转换为数组
    /**
    * [analyzeResult description]
    * @param [type] $xmlString [description]
    * @return [type] [description]
    */
    public static function analyzeResult($xmlObject)
    {
    $xmlArray = (array)$xmlObject;
    if(empty($xmlArray)){
    return '';
    }
    $data = array();
    foreach ($xmlArray as $key => $value) {
    if(!is_string($value)){
    $data[$key] = self::analyzeResult($value);
    }else{
    $data[$key] = $value;
    }
    }
    return $data;
    }

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料