2012-10-03 20 views
5

Creo que me falta algo muy obvio aquí, pero alguien puede explicarme por qué estoy recibiendo la salida que soy y no la salida espero en el siguiente var vertederos:simplexml propiedad de matriz

Aquí el XML original:

<result> 
    <category> 
     <id>3</id> 
     <name>Category 1</name> 
     <subcategory> 
      <id>9</id> 
      <name>SubCat 1</name> 
     </subcategory> 
     <subcategory> 
      <id>10</id> 
      <name>SubCat 2</name> 
     </subcategory> 
     <subcategory> 
      <id>11</id> 
      <name>SubCat 3</name> 
     </subcategory> 
    </category> 
</result> 

lo que estoy haciendo:

$xml = new SimpleXMLElement($file); 
foreach($xml->category as $node) 
{ 
    echo "dump 1: 
"; 
    var_dump($node); 
    echo "********************************************** 
dump 2: 
"; 
    var_dump($node->subcategory); 
    die(); 
} 

Este salidas:

dump 1: 
object(SimpleXMLElement)#130 (3) { 
    ["id"]=> 
    string(1) "3" 
    ["name"]=> 
    string(10) "Category 1" 
    ["subcategory"]=> 
    array(3) { 
     [0]=> 
     object(SimpleXMLElement)#133 (2) { 
      ["id"]=> 
      string(1) "9" 
      ["name"]=> 
      string(8) "SubCat 1" 
     } 
     [1]=> 
     object(SimpleXMLElement)#135 (2) { 
      ["id"]=> 
      string(2) "10" 
      ["name"]=> 
      string(8) "SubCat 2" 
     } 
     [2]=> 
     object(SimpleXMLElement)#136 (2) { 
      ["id"]=> 
      string(2) "11" 
      ["name"]=> 
      string(8) "SubCat 3" 
     } 
    } 
} 
********************************************** 
dump 2: 
object(SimpleXMLElement)#138 (2) { 
    ["id"]=> 
    string(1) "9" 
    ["name"]=> 
    string(8) "SubCat 1" 
} 

El primer volcado var da salida a lo que cabe esperar, pero la salida que se puede esperar para el segundo var_dump sería:

array(3) { 
    [0]=> 
    object(SimpleXMLElement)#133 (2) { 
     ["id"]=> 
     string(1) "9" 
     ["name"]=> 
     string(8) "SubCat 1" 
    } 
    [1]=> 
    object(SimpleXMLElement)#135 (2) { 
     ["id"]=> 
     string(2) "10" 
     ["name"]=> 
     string(8) "SubCat 2" 
    } 
    [2]=> 
    object(SimpleXMLElement)#136 (2) { 
     ["id"]=> 
     string(2) "11" 
     ["name"]=> 
     string(8) "SubCat 3" 
    } 
} 

O incluso un objeto que contiene todos los elementos de matriz. ¿Por qué no es este el caso?

Veo cuando llamo al var_dump($node->subcategory) que está volcando el primer nodo de "subcategoría" que encuentra, pero ¿por qué entonces lanza todos los nodos de "subcategoría" a una matriz para el primer volcado de var pero no para el segundo? ¿Y cómo voy a imitar este comportamiento para detectar si 'subcategoría' contiene más de un objeto (como lo hace en el primer volcado de var)?

Básicamente lo que estoy tratando de hacer es detectar si una propiedad de la SimpleXMLElement contiene una matriz de varios valores (es decir, si contiene nodos hijos)

que he probado todo tipo, pero no puedo parece detectar si una de las propiedades del objeto simpleXml contiene un conjunto de matrices.

Actualización:

he encontrado que esto funciona:

if(count($node->subcategory)>1) 
{ 
    // we have more than one subcategory 
} 

Pero no es la forma más elegante, estoy seguro de que debe ser un método más limpio?

+0

la respuesta a esta entrada podría ayuda: http://stackoverflow.com/questions/2751711/php-get-values-from-simplexmlelement-array?rq = 1 ** var_dump ($ nodo ["subcategoy"]); ** – feskr

+0

@feskr gracias, estoy empujando todas las propiedades (y por lo tanto los atributos) a través de un bucle foreach en mi código actual y no parece para diferenciar entre atributos y propiedades, ¡que es un problema! – Stu

+0

@feskr 'var_dump ($ nodo [" subcategoría "])' salidas: 'NULL' – Stu

Respuesta

1

Esta propiedad es objeto de iterarator:

$node->subcategory 

Y si usted necesita para obtener todos los artículos Proveedores:

foreach($xml->category as $node) 
{ 
... 
    foreach($node->subcategory as $subcategory) 
    { 
    $data[] = (array) $subcategory 
    } 
... 
} 

Si lo que necesita saber recuento de los elementos subcategoría recuento de método que se utiliza con éxito .

Y puede utilizar XPath si no va a cambiar árbol XML:

$categories = $xml->xpath('/category/subcategory'); 
var_dump($categories) 
+0

el método xpath no funcionará en mi caso particular ya que las subcategorías pueden ser recursivas (¡pesadilla!). Sin embargo, el método $ data es muy adaptable, ¡gracias! – Stu

1

Ajuste su archivo xml:

<result> 
    <category> 
     <id>3</id> 
     <name>Category 1</name> 
     <subcategories> 
      <subcategory> 
      <id>9</id> 
      <name>SubCat 1</name> 
      </subcategory> 
      <subcategory> 
      <id>10</id> 
      <name>SubCat 2</name> 
      </subcategory> 
      <subcategory> 
      <id>11</id> 
      <name>SubCat 3</name> 
      </subcategory> 
     </subcategories> 
    </category> 
</result> 

Y tratar:

var_dump($node->subcategories); 
+0

ejemplo de php.net: http://www.php.net/manual/en/simplexml.examples-basic.php – feskr

+0

Gracias, eso solo funcionaría. Desafortunadamente, no puedo modificar el archivo XML. – Stu

+0

+1 como eso hubiera funcionado si pudiera editar el xml! – Stu