0

私はこの問題を数回見ましたが、決定的な答えが欲しいです。

xmlでこの構造を考えると:

<ByteListSet>
    <Byte Order="0">14</Byte>
</ByteListSet>

属性「order」にアクセスできません。var_dump(当然のことながら)はByteListSetの属性を表示しません。実際、foreachの反復では@attributesアイテムは生成されません。

ただし、次の構造:

<ByteListSet>
    <Byte Order="0"><Value>3729</Value></Byte>
</ByteListSet>

@attributesを持つSimpleXmlObjectである子Byteを持つByteListSetで適切に結果が得られます。

SimpleXMLは実際に最初のケースから@attributesを取得していると思いますが、それらをどこに保持しているのでしょうか。問題は、前者の構造では、ByteListSetが-> children()のvar_dumpでこれを生成することです。

object(SimpleXMLElement)[25]
  public 'Byte' => string '14' (length=2)

その上でget_object_vars()を取得し、それぞれvar_dumpを実行すると、次のようになります。

string '14' (length=2)

Byteがxmlオブジェクトとしてではなく、文字列として返されることを示します。その上のByteListオブジェクトのプロパティとして。

Order = "0"はどこかにありますが、アクセスできません。どうすればアクセスできますか?注:-> attributes()は、ご想像のとおり、空白の配列を返します。

(このスキーマは制御されていないため、再構築できません。)

4

1 に答える 1

0

あなたが書いた:

xml でこの構造を考えると、次のようになります。

<ByteListSet>
    <Byte Order="0">14</Byte>
</ByteListSet>

属性「注文」にアクセスできません。

確かに、属性orderが存在しないためです。XMLでは大文字と小文字が区別され、属性の名前は先頭Orderが大文字になります。O

正しい属性名を使用すると、マニュアルにある SimpleXML 拡張機能の基本的な例の例 #5 で説明されているように、値にアクセスできます。

$ByteListSet = simplexml_load_string(<<<XML
<ByteListSet>
    <Byte Order="0">14</Byte>
</ByteListSet>
XML
);

echo $ByteListSet->Byte['Order']; # 0

var_dumpあなたが見ているもの、またはあなたが得るものとは限らないことを心に留めておいてくださいprint_r. これは特に Simplexml に当てはまります (比較: xml 要素の値を取得する方法は? ; SimpleXML と print_r() -なぜこれは空なのですArrayAccess__toString()? ) 。IteratorIteratorIteratorAggregate

それがあなたの質問に答えるかどうか私に知らせてください。これまでに理解していない既存のソリューションについて具体的に説明されていなかったので、質問に回答しましたが、100% 当てはまらないとは限りません。

于 2013-01-28T16:42:45.493 に答える