PHP Conference Japan 2024

xml_parse_into_struct

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parse_into_struct將 XML 資料解析成陣列結構

說明

xml_parse_into_struct(
    XMLParser $parser,
    字串 $data,
    陣列 &$values,
    陣列 &$index = null
): 整數|false

這個函數會將 XML 字串解析成兩個平行的陣列結構,一個 (index) 包含指向 values 陣列中適當值位置的指標。最後兩個參數必須以傳址方式傳遞。

參數

parser

XML 解析器的參考。

data

包含 XML 資料的字串。

values

包含 XML 資料值的陣列。

index

包含指向 $values 中適當值位置的指標的陣列。

回傳值

xml_parse_into_struct() 失敗時返回 0,成功時返回 1。這與 falsetrue 不同,使用 === 等運算子時要小心。

更新日誌

版本 說明
8.0.0 parser 現在需要一個 XMLParser 實例;以前需要一個有效的 xml 資源

範例

以下範例說明了函數生成的陣列的內部結構。我們使用嵌入在 para 標籤內的簡單 note 標籤,然後解析它並印出生成的結構。

範例 #1 xml_parse_into_struct() 範例

<?php
$simple
= "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
echo
"索引陣列\n";
print_r($index);
echo
"\n值陣列\n";
print_r($vals);
?>

執行該程式碼時,輸出將為

Index array
Array
(
    [PARA] => Array
        (
            [0] => 0
            [1] => 2
        )

    [NOTE] => Array
        (
            [0] => 1
        )

)

Vals array
Array
(
    [0] => Array
        (
            [tag] => PARA
            [type] => open
            [level] => 1
        )

    [1] => Array
        (
            [tag] => NOTE
            [type] => complete
            [level] => 2
            [value] => simple note
        )

    [2] => Array
        (
            [tag] => PARA
            [type] => close
            [level] => 1
        )

)

當 XML 文件很複雜時,事件驅動的解析(基於 expat 函式庫)可能會變得複雜。此函數不會產生 DOM 樣式的物件,但它會產生適合以樹狀方式遍歷的結構。因此,我們可以輕鬆地創建表示 XML 檔案中資料的物件。讓我們考慮以下表示胺基酸資訊小型資料庫的 XML 檔案。

範例 #2 moldb.xml - 分子資訊小型資料庫

<?xml version="1.0"?>
<moldb>

  <molecule>
      <name>Alanine</name>
      <symbol>ala</symbol>
      <code>A</code>
      <type>hydrophobic</type>
  </molecule>

  <molecule>
      <name>Lysine</name>
      <symbol>lys</symbol>
      <code>K</code>
      <type>charged</type>
  </molecule>

</moldb>
以及一些用於解析文件並生成適當物件的程式碼。

範例 #3 parsemoldb.php - 將 moldb.xml 解析為分子物件陣列

<?php

class AminoAcid {
var
$name; // aa name
var $symbol; // three letter symbol
var $code; // one letter code
var $type; // hydrophobic, charged or neutral

function __construct ($aa)
{
foreach (
$aa as $k=>$v)
$this->$k = $aa[$k];
}
}

function
readDatabase($filename)
{
// read the XML database of aminoacids
$data = file_get_contents($filename);
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $tags);
xml_parser_free($parser);

// loop through the structures
foreach ($tags as $key=>$val) {
if (
$key == "molecule") {
$molranges = $val;
// each contiguous pair of array entries are the
// lower and upper range for each molecule definition
for ($i=0; $i < count($molranges); $i+=2) {
$offset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - $offset;
$tdb[] = parseMol(array_slice($values, $offset, $len));
}
} else {
continue;
}
}
return
$tdb;
}

function
parseMol($mvalues)
{
for (
$i=0; $i < count($mvalues); $i++) {
$mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
}
return new
AminoAcid($mol);
}

$db = readDatabase("moldb.xml");
echo
"** Database of AminoAcid objects:\n";
print_r($db);

?>
執行 parsemoldb.php 後,變數 $db 包含一個 AminoAcid 物件的陣列,並且腳本的輸出確認了這一點。
** Database of AminoAcid objects:
Array
(
    [0] => aminoacid Object
        (
            [name] => Alanine
            [symbol] => ala
            [code] => A
            [type] => hydrophobic
        )

    [1] => aminoacid Object
        (
            [name] => Lysine
            [symbol] => lys
            [code] => K
            [type] => charged
        )

)

新增註記

使用者貢獻的註記

此頁面沒有使用者貢獻的註記。
To Top