Pregunta

Necesito enviar una cadena de html tiene como <total> <tag>content</tag> <tag2 ref="333"> <code>somecode</code> <code>morecode</code> </tag2> <tag3> more code </tag3> </total>

Esto iría en una matriz como:

$arra[] = "<tag>content</tag>";
$arra[] = "<tag2 ref="333">";
$arra[] = "<code ... etc

Pero no estoy descubriendo cómo transformar estos datos en la matriz.

¿Algún consejo?

¿Fue útil?

Solución

Entonces desea convertir esta estructura de datos de árbol:

<total> 
  <tag>content</tag> 
  <tag2 ref="333"> 
    <code>somecode</code> 
    <code>morecode</code> 
  </tag2> 
  <tag3> more code </tag3> 
</total>

En algún tipo de matriz plana:

Array
(
    [0] => "<tag>content</tag>"
    [1] => "<tag2 ref="333"></tag2>"
    [2] => "<code>somecode</code>"
    [3] => "<code>morecode</code> 
    [4] => "<tag3> more code </tag3> "
)

sería complicado. Este es un problema clásico de CS que no tiene muchos buenos respondedores. La estructura de árbol proporciona información sobre las relaciones entre las entradas que una matriz o lista plana no. Cualquier intento de aplanar el árbol en una lista perderá ese contexto referencial.

Puede explotar la cadena y luego recorrerla haciendo un seguimiento de los elementos primarios o ignorándolos (ver etiqueta2). Si tuviera que hacer algo con el xml, lo dejaría caer en un SimpleXMLElement, lo que produciría algo como esto:

SimpleXMLElement Object
(
    [tag] => content
    [tag2] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [ref] => 333
                )
            [code] => Array
                (
                    [0] => somecode
                    [1] => morecode
                )
        )
    [tag3] =>  more code 
)

Con esto puedo caminar con foreach y encontrar la etiqueta y su contenido. Puedo probar para ver si los contenidos son cadenas o elementos secundarios y, de ser así, caminarlos. Una función recursiva haría un trabajo bastante corto de este problema. El mayor problema es cómo representar los datos una vez que se aplanan.

Si lo aplana en el ejemplo de matriz que proporcioné anteriormente, las etiquetas padre e hijo pierden cualquier relación implícita entre sí. Si esto no es un problema, genial. Escribe la función recursiva y listo. Aquí hay un psudocódigo:

function walking($content)
  $out is the array chunk that is returned
  foreach $content as $tag->$data
    if $value is an SimpleXMLElement
      collapse $data[@attributes] into a string $attributes
      append <$tag $attributes></$tag> to the end of $out
      you may need to remove @attributes before recursing.
      recurse into  walking($data) and append the returned array to the end of $out
    if $value is an Array
      append <$tag></$tag> to the end of $out
      recurse into  walking($data) and append the returned array to the end of $out
    if $value is a string
      append <$tag>$value</$tag> to the end of $out
  after looping through $content return $out.

Sin embargo, si necesita mantener intactas esas relaciones, tiene un pequeño problema y tendrá que idear algún tipo de esquema para eso

Otros consejos

Simplemente:

$lines = explode('> ', $xml);
foreach($lines as $line) {
  $arra[] = $line.'> ';
}

Sin embargo, esto supone que la muestra dada es una representación exacta de su XML (es decir, utiliza > y < dentro de los bloques de etiquetas) y no tiene en cuenta los bloques CDATA o los comentarios XML. http://www.w3.org/TR/REC-xml/#syntax

De lo contrario, miraría los comentarios en la página PHP.net: http://us.php.net/manual/en/function. xml-parse.php

¿Qué estás tratando de hacer exactamente? Si da una idea más amplia del problema que está tratando de resolver, podríamos darle una mejor solución.

Si obtiene los datos de un archivo, la función file () le dará una matriz de una línea por fila. ¡Podría ser la forma más fácil!

$xml = file_get_contents("../../xml/LL1234.xml");

$x = simplexml_load_string($xml);

function viewElements($x){
    $Arr = $GLOBALS['Arr'];
    if (count($x->attributes()) > 0 ){
        $attr='';
        foreach ($x->attributes() as $k => $v ){
                $attr .= " $k='".$v."'";
        }
    }

    $Arr[] = "<".$x->getName()." $attr>\n";
    if (count($x->children()) > 0 ){
        foreach ($x->children() as $k ){
            $GLOBALS['Arr'] = $Arr;
            viewElements($k);
            $Arr = $GLOBALS['Arr'];
        }
    }else{
        $Arr[] = $x[0];
    }

    $Arr[] = "</".$x->getName().">";
    $GLOBALS['Arr'] = $Arr;
}

foreach ($x->children() as $k ){
    viewElements($k);
}

foreach ($GLOBALS['Arr'] as $k ){
    print $k."\n";
}
?>

Disculpe las molestias gracias a tvanover. Entiendo que una mejor manera de hacerlo es la solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top