XML Parser xml_parse_into_struct

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

xml_parse_into_struct — XML 데이터를 배열 구조로 구문 분석


설명

xml_parse_into_struct(
    XMLParser $parser,
    string $data,
    array &$values,
    array &$index = null
): int
                

이 함수는 XML 문자열을 2개의 병렬 배열 구조로 구문 분석합니다. 하나는 values ​​배열에서 적절한 값의 위치에 대한 포인터를 포함하는 (index)입니다. 이 마지막 두 매개변수는 참조로 전달되어야 합니다.


매개변수

parser
XML 파서에 대한 참조입니다.
data
XML 데이터를 포함하는 문자열입니다.
values
XML 데이터의 값을 포함하는 배열
index
$values에서 적절한 값의 위치에 대한 포인터를 포함하는 배열입니다.

반환 값

xml_parse_into_struct()는 실패하면 0을, 성공하면 1을 반환합니다. 이것은 falsetrue와 동일하지 않으므로 ===와 같은 연산자에 주의하십시오.


변경 로그

버전 설명
8.0.0 parser는 이제 XMLParser 인스턴스를 예상합니다. 이전에는 리소스가 필요했습니다.

Examples

다음은 함수에 의해 생성되는 배열의 내부 구조를 보여주는 예입니다. 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 "Index array\n";
print_r($index);
echo "\nVals array\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
        )

)