2

PHPで解析したいXMLのこの小さなチャンクがあります。Worksタグは大丈夫です、私はすべての属性をうまく解析することができます。私が抱えている問題はDoesntタグにあります。タグにはテキストコンテンツが含まれているため、属性にアクセスできないようです。

<Export id="123" apples="pears">
    <Works foo="bar" id="234"/>
    <Doesnt bar="foo" id="345">Stack Exchange</Doesnt>
</Export>

次の(非常に単純な)コードを実行します。

$plain = '<Export id="123" apples="pear....esnt></Export>'; // as above
$sxe = simplexml_load_string($plain);
$json = json_encode($sxe);
$native = json_decode($json);
print_r($sxe, true);
print_r($native, true);

そして、私は次の出力になります:

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [id] => 123
            [apples] => pears
        )
    [Works] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [foo] => bar
                    [id] => 234
                )
        )
    [Doesnt] => Stack Exchange
)

stdClass Object
(
    [@attributes] => stdClass Object
        (
            [id] => 123
            [apples] => pears
        )

    [Works] => stdClass Object
        (
            [@attributes] => stdClass Object
                (
                    [foo] => bar
                    [id] => 234
                )

        )

    [Doesnt] => Stack Exchange
)

ご覧のとおり、SimpleXMLElementオブジェクトとオブジェクトの両方にタグstdClassのすべての属性がありません。それらに到達するための回避策または代替手段はありますか?<Doesnt>

4

1 に答える 1

2

@Gordonが言ったように、print_rand var_dump:SimpleXMLElement Objectにはいくつかの異常なプロパティがあるため、これらのダンプ関数はその構造を正しく表現できません。

それでも、代わりにこれを使用した場合:

$sxe = simplexml_load_string($plain);
var_dump($sxe->Doesnt);

... これらの属性とその値はそのままであることがわかります。

ただし、出力をよく見てください。

object(SimpleXMLElement)[3]
  public '@attributes' => 
    array (size=2)
      'bar' => string 'foo' (length=3)
      'id' => string '345' (length=3)
  string 'Stack Exchange' (length=14)

string値がぶら下がっているだけで、対応するプロパティが所有していないというのは、ちょっと珍しいことだと思いませんか? しかし、それこそが直接変換を問題にするものです。JSON (そのまま) は単純な構造 (オブジェクトと配列) を扱いますが、この構造はどちらでも正しく表すことができません。テキスト コンテンツを格納するために、少なくともいくつかの追加属性を導入する必要があります。

それでも、このアプローチは (ある程度) 需要があるようであり、あなただけではないことは間違いありません: PHP バグ追跡システムのオープン チケットを次に示します。

于 2012-11-05T11:16:33.740 に答える