首頁  >  文章  >  後端開發  >  php數組轉xml轉不回來

php數組轉xml轉不回來

WBOY
WBOY原創
2023-05-07 18:52:08511瀏覽

PHP 是一種非常強大的程式語言,用於 web 開發中取得和處理資料。 XML 是一種標記語言,用於在 Web 上儲存和傳輸資料。在 PHP 中,我們可以使用陣列作為資料結構將資料儲存起來,然後將其轉換為 XML 格式。但是,有時在將 XML 轉換回 PHP 陣列時可能會遇到問題。接下來,我們將探討這個問題,並提供解決方案。

一、陣列轉 XML
在 PHP 中將陣列轉換為 XML 格式很簡單。我們只需要遍歷數組並使用 PHP 內建函數將其轉換為 XML。以下是一個範例程式碼:

<?php
$data = array(
    'name' => 'John',
    'age' => 30,
    'gender' => 'male'
);
$xml = new SimpleXMLElement('<data/>');
array_walk_recursive($data, array($xml, 'addChild'));
echo $xml->asXML();
?>

輸出:

<?xml version="1.0"?>
<data>
  <name>John</name>
  <age>30</age>
  <gender>male</gender>
</data>

我們可以使用 SimpleXMLElement 類別來建立新的 XML 文件。然後將數組資料新增至 XML 標記。

二、 XML 轉數組
將 XML 轉換回 PHP 陣列相對麻煩一些。 PHP 內建函數不支援此功能。但是,SimpleXML 擴充功能提供了一種解析 XML 的方法,並將其轉換為物件。在這個物件中,我們可以使用屬性名稱來取得其值。例如,以下是一個範例XML 文件:

<?xml version="1.0"?>
<data>
  <name>John</name>
  <age>30</age>
  <gender>male</gender>
</data>

我們可以將其轉換為PHP 陣列:

輸出:

array(3) {
  ["name"]=>
  string(4) "John"
  ["age"]=>
  string(2) "30"
  ["gender"]=>
  string(4) "male"
}

我們使用simplexml_load_string 函數將XML 字串轉換為SimpleXML 對象,然後使用PHP 內建json_encode 函數將其轉換為JSON 字串。最後使用 json_decode 函數將 JSON 字串轉換為陣列。

三、 XML 轉換回陣列時的問題
如果我們在將 XML 轉換為 PHP 陣列時遇到問題,這可能是因為 SimpleXML 物件的屬性名稱中包含了特殊字元。例如,以下是一個範例XML 文件:

<?xml version="1.0"?>
<data>
  <company-name>ABC Inc.</company-name>
  <employees>
    <employee id="1">John</employee>
    <employee id="2">Mike</employee>
  </employees>
</data>

以下是嘗試將此XML 轉換為PHP 陣列的範例程式碼:

輸出:

array(2) {
  ["company-name"]=>
  string(8) "ABC Inc."
  ["employees"]=>
  array(1) {
    ["employee"]=>
    array(2) {
      [0]=>
      string(4) "John"
      [1]=>
      string(4) "Mike"
    }
  }
}

在輸出中, "employee" 以陣列傳回,而不是包含employee 名稱和屬性的關聯陣列。這是因為屬性名稱中的減號 "-" 會導致關聯數組的鍵名稱錯誤。例如,我們可以將 "company-name" 改為 "company_name" 然後執行相同的程式碼。以下是範例:

<?xml version="1.0"?>
<data>
  <company_name>ABC Inc.</company_name>
  <employees>
    <employee id="1">John</employee>
    <employee id="2">Mike</employee>
  </employees>
</data>

以下是輸出:

array(2) {
  ["company_name"]=>
  string(8) "ABC Inc."
  ["employees"]=>
  array(1) {
    ["employee"]=>
    array(2) {
      [0]=>
      string(4) "John"
      [1]=>
      string(4) "Mike"
    }
  }
}

在這個輸出中,"employee" 作為關聯數組返回,並包括 employee 名稱和屬性。

解決此問題的方法是使用 SimpleXML 物件中的屬性名稱而不是作為鍵名稱。以下是一個帶有特殊字元的範例 XML 文件和 PHP 程式碼:

<?xml version="1.0"?>
<data>
  <company-name>ABC Inc.</company-name>
  <employees>
    <employee id="1">John</employee>
    <employee id="2">Mike</employee>
  </employees>
</data>
 $value) {
    if ($value->count() > 0) {
        foreach ($value as $childKey => $childValue) {
            $data = array();

            foreach ($childValue->attributes() as $attributeName => $attributeValue) {
                $data["@" . $attributeName] = (string) $attributeValue;
            }

            $data["name"] = $childValue->__toString();

            if (!isset($result[$key]) || !is_array($result[$key])) {
                $result[$key] = array();
            }

            array_push($result[$key], $data);
        }
    }
    else {
        $data = (string) $value;

        if (isset($result[$key])) {
            if (!is_array($result[$key])) {
                $result[$key] = array($result[$key]);
            }

            array_push($result[$key], $data);
        }
        else {
            $result[$key] = $data;
        }
    }
}

var_dump($result);
?>

程式碼實作了一種使用 SimpleXML 物件中的屬性名稱將 XML 轉換為 PHP 陣列的方法。在此範例中,包含屬性的 XML 標記將轉換為關聯數組。例如,以下是我們的範例XML 文件的輸出:

array(2) {
  ["company-name"]=>
  string(8) "ABC Inc."
  ["employees"]=>
  array(2) {
    [0]=>
    array(2) {
      ["@id"]=>
      string(1) "1"
      ["name"]=>
      string(4) "John"
    }
    [1]=>
    array(2) {
      ["@id"]=>
      string(1) "2"
      ["name"]=>
      string(4) "Mike"
    }
  }
}

從輸出中可以看出,該方法正確地將屬性名稱解析為關聯數組,並將其與其他標記一起包含在同一數組中。

結論:

在 PHP 中,將陣列轉換為 XML 並將其轉換回陣列相對簡單。但是,在將 XML 轉換回 PHP 陣列時可能會遇到問題,特別是屬性名稱中包含特殊字元的情況。使用 SimpleXML 物件中的屬性名稱可以解決此問題,因為在解析 XML 時會將其轉換為關聯數組。透過了解這些訣竅,您應該能夠成功地在 PHP 中轉換 XML 和陣列之間的格式。

以上是php數組轉xml轉不回來的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn