6

を使用してXMLファイルをロードしました

simplexml_load_file($filePath,'SimpleXMLElement', LIBXML_NOCDATA);

また、提供されたほとんどの XML では問題なく動作します。ただし、XML の一部の要素では、属性が「@attributes」配列に変換されず、代わりに出力から欠落します。サンプルは次のとおりです。

<UI_DEFINITION>
<EDIT_PERMISSION>testPermission</EDIT_PERMISSION>
<DEFAULT_VALUES>
    <display>hidden</display>
    <css_class>generic_css_class</css_class>
    <title>{tag}</title>
    <type>string</type>
    <wrapper_format>{value}</wrapper_format>
    <full_path>false</full_path>
    <mandatory>false</mandatory>
    <edit_permission>testPermission</edit_permission>
    <max_length>0</max_length>
</DEFAULT_VALUES>
<LOOKUPS>
    <DB_LOOKUP name="test3">
        <VIEW>???</VIEW>
        <ID_FIELD>???</ID_FIELD>
        <DESCR_FIELD>???</DESCR_FIELD>
        <ORDER>??? asc</ORDER>
    </DB_LOOKUP>
    <DB_LOOKUP name="test1">
        <VIEW>???</VIEW>
        <ID_FIELD>???</ID_FIELD>
        <DESCR_FIELD>???</DESCR_FIELD>
        <ORDER>??? asc</ORDER>
    </DB_LOOKUP>
</LOOKUPS>
<AREA internal_name="main_details" title="" display="show">
    <FIELD lookup="test1" title="Title">Title</FIELD>
    <FIELD title="Name">Given_Name</FIELD>
    <FIELD title="Mid. Name(s)">Middle_Names</FIELD>
    <FIELD title="Family Name">Family_Name</FIELD>
    <FIELD title="Gender">Gender</FIELD>
    <FIELD title="Born" type="date">Date_of_Birth</FIELD>
    <FIELD max_length="20" title="ID">Unique_Identifier</FIELD>
</AREA>

これにより、print_r から次の出力が得られます (問題のビットに改行を追加しました)。

SimpleXMLElement Object ( [UI_DEFINITION] => SimpleXMLElement Object ( [EDIT_PERMISSION] => testPermission [DEFAULT_VALUES] => SimpleXMLElement Object ( [display] => hidden [css_class] => generic_css_class [title] => {tag} [type] => string [wrapper_format] => {value} [full_path] => false [mandatory] => false [edit_permission] => testPermission [max_length] => 0 ) [LOOKUPS] => SimpleXMLElement Object ( [DB_LOOKUP] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => test3 ) [VIEW] => ??? [ID_FIELD] => ??? [DESCR_FIELD] => ??? [ORDER] => ??? asc ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => test1 ) [VIEW] => ??? [ID_FIELD] => ??? [DESCR_FIELD] => ??? [ORDER] => ??? asc ) ) ) 
[AREA] => SimpleXMLElement Object ( [@attributes] => Array ( [internal_name] => main_details [title] => [display] => show ) [FIELD] => Array ( [0] => Title [1] => Given_Name [2] => Middle_Names [3] => Family_Name [4] => Gender [5] => Date_of_Birth [6] => Unique_Identifier ) ) ) )

ご覧のとおり、属性配列はほとんどの要素に正しく追加されていますが、FIELD 要素には追加されていません。名前を変更してみましたが、違いはないようです。

編集:また、FIELD タグを FIELDS タグで囲んでみましたが、これも役に立ちませんでした。

編集:

XML を大幅に簡素化しましたが、それでも anny 属性は返されません。

<UI_DEFINITION>
                            <FIELD lookup="test1" title="Title">Title</FIELD>
                    </UI_DEFINITION>

生成:

SimpleXMLElement Object ( [UI_DEFINITION] => SimpleXMLElement Object ( [FIELD] => Title ) )
4

2 に答える 2

8

次のような属性にアクセスできます。

$obj = simplexml_load_string($xml);

foreach($obj->AREA->FIELD as $field)
{
   echo $field->attributes()->title . '<br />';
}

print_r()SimpleXML の完全な構造が常に表示されるわけではありませんが、属性は使用するために存在します。

于 2012-04-20T14:35:43.897 に答える
3

申し訳ありませんが、戻ってきてこの質問に答えるのに時間がかかりました!

MrCode が示唆したように、属性アクセス可能でした。私が抱えていた問題は、SimpleXML オブジェクトを別の形式にシリアライズすることでした。while オブジェクトで printr または json_convert を使用すると、報告されたケースで属性が使用できなくなりました。

問題のあるケースを含め、これらのオブジェクトを印刷または変換するためのコードベースの回避策を見つけるほど深くは踏み込みませんでした。XML データの一部として回避しただけです。

<UI_DEFINITION>
        <FIELD lookup="test1" title="Title"><VALUEPATH>Title</VALUEPATH></FIELD>
 </UI_DEFINITION>

この余分なレベルを階層に追加すると、属性が最上位レベルで保持され、テキスト値がサブレベルで正しく使用できるようになりました。

于 2012-06-26T08:31:30.853 に答える