2012-04-20 22 views
5

He cargado un archivo XML utilizandoCargando XML con SimpleXML no devuelve atributos en algunos elementos

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

Y la mayor parte del XML proporcionan funciona bien. Sin embargo, para algunos de los elementos del XML, los atributos no se convierten en una matriz '@attributes' y, en cambio, faltan en el resultado. He aquí una muestra:

<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> 

Esto da la siguiente salida de print_r (He añadido un salto de línea en la parte que es el problema):

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)))) 

Como se puede ver, la matriz de atributos se agrega correctamente a la mayoría de los elementos, pero no a los elementos de CAMPO. Intenté cambiarles el nombre y no pareció marcar la diferencia.

EDIT: También debo agregar que he intentado rodear las etiquetas FIELD con una etiqueta FIELDS, también fue en vano.

EDIT:

He simplificado enormemente el XML, y todavía no vuelve Anny atributos:

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

produce:

SimpleXMLElement Object ([UI_DEFINITION] => SimpleXMLElement Object ([FIELD] => Title)) 
+1

He encontrado la respuesta, pero no puedo auto-responder durante 7 horas. El problema es que SimpleXML no permite atributos y texto en el mismo elemento. Publicaré una respuesta completa cuando pueda. – alitheg

Respuesta

4

Lo siento, ha tardado tanto en volver y contestar esta pregunta.

Como MrCode sugirió, los atributos eran accesibles. El problema que estaba en la serialización del objeto SimpleXML en otro formato. Al usar printr o json_convert en el objeto while, los atributos no estaban disponibles en los casos informados.

no fui lo suficiente en esto para encontrar una solución a base de código para imprimir o convertir estos objetos, incluyendo los casos problemáticos, simplemente trabajaron alrededor de ella como parte de los datos XML:

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

Agregar este nivel adicional a la jerarquía resultó en que los atributos se conservan en el nivel superior y que el valor de texto esté disponible correctamente en el subnivel.

8

Los atributos son accesibles, por ejemplo:

$obj = simplexml_load_string($xml); 

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

print_r() no siempre muestra la estructura completa con SimpleXML, pero los atributos están ahí para su uso.

+0

Gracias por su respuesta. Vea el comentario que agregué a la pregunta. Sin embargo, probar el código que me proporcionó me dio más información sobre el problema: – alitheg

+0

Al presionar Enter posts en lugar de un salto de línea. Entonces, usando un bucle for pude obtener los atributos, como sugirió. Lo que no había agregado era que más adelante en la línea de mi página estoy usando json_convert en el objeto resultante.Parecería que las limitaciones que percibí están presentes en la impresión o serialización, pero no en la interacción directa en PHP, si eso tiene sentido. – alitheg

+0

Si le parece bien, preferiría aceptar la respuesta que publicaré ya que muestra el problema más claramente, pero lo agregaré. No puedo respaldarlo porque no tengo suficiente reputación. ¡Gracias! – alitheg

Cuestiones relacionadas