8

さて、私はxmlを配列に戻す際に問題を抱えていました....各xmlが同じ形式に従っている場合は簡単ですが、<Formula>タグ、formulaname、およびmovespeed exを除いてすべてのXMLは異なります。

<Formula>
<formulaname>Basic</formulaname>
<movespeed>1</movespeed>
<str>4</str>
<dex>3</dex>
<int>1</int>
<will>2</will>
</Formula>

また

<Formula>
<formulaname>Basic</formulaname>
<movespeed>1</movespeed>
<box>4</box>
<chicken>3</chicken>
<ducks>1</ducks>
<cereal>2</cereal>
</Formula>

私が試したこと:

$xml = simplexml_load_file("test.xml");
print_r($xml);

これは実際にはprints何かですが、私はそれを乗り越えることができませんでしechoた..

foreach($xml->text as $string) { 
  print_r($string);
  echo 'attributes: '. $string->attributes() .'<br />';
}

機能しませんでした。もともとは目的でしstringsたが、どれもstrings...

foreach ($xml->Formula as $element) {
  foreach($element as $key => $val) {
   echo "{$key}: {$val}";
  }

どちらも機能しませんでしたarray。値が正確に何と呼ばれるかを知らなくても値を使用できるように、このようなものが必要でした..

4

4 に答える 4

19

これが最善の策です。すべての SimpleXMLElement オブジェクトを削除し、代わりに配列だけを提供する必要があります。

$xml = simplexml_load_file("test.xml");
$xml_array = unserialize(serialize(json_decode(json_encode((array) $xml), 1)));
print_r($xml_array);

これの違いは次のとおりです。


SimpleXMLElement オブジェクトの配列


この:


すべての配列 - SimpleXMLElement オブジェクトとの混合なし


それが役立つことを願っています... :)

于 2013-08-04T07:23:01.390 に答える
9

ノード自体でforeachを使用して子にアクセスすることはできません。次を使用する必要があります.children()

$s =<<<EOS
<root>
<Formula>
<formulaname>Basic</formulaname>
<movespeed>1</movespeed>
<box>4</box>
<chicken>3</chicken>
<ducks>1</ducks>
<cereal>2</cereal>
</Formula>
</root>
EOS;

$xml = simplexml_load_string($s);

foreach ($xml->Formula as $element) {
    foreach($element->children() as $key => $val) {
        echo "{$key}: {$val}";
    }
}
于 2012-08-27T19:59:50.667 に答える
9

あなたの例では、このコードで十分です:

$xml = simplexml_load_file('formula.xml');
$arr = (array) $xml;
var_dump($arr);

あなたのxmlは配列に入り
ます formula.xml にはあなたのxmlが含まれています

于 2012-08-27T21:31:05.327 に答える
3

同じノードに cdata と属性がある場合、上記の方法を使用すると属性が省略されます。

この方法を試してください:

function xml2array($xmlObject, $out = [])
{
    foreach($xmlObject->attributes() as $attr => $val)
        $out['@attributes'][$attr] = (string)$val;

    $has_childs = false;
    foreach($xmlObject as $index => $node)
    {
        $has_childs = true;
        $out[$index][] = xml2array($node);
    }
    if (!$has_childs && $val = (string)$xmlObject)
        $out['@value'] = $val;

    foreach ($out as $key => $vals)
    {
        if (is_array($vals) && count($vals) === 1 && array_key_exists(0, $vals))
            $out[$key] = $vals[0];
    }
    return $out;
}
$xml = simplexml_load_string($xml_string, 'SimpleXMLElement', LIBXML_NOCDATA);
$arr = xml2array($xml);
于 2014-02-17T15:26:04.570 に答える