Array PHP SimpleXML Elemanları

4 Cevap php

I need to send a string of html has is like <total> <tag>content</tag> <tag2 ref="333"> <code>somecode</code> <code>morecode</code> </tag2> <tag3> more code </tag3> </total>

Bu gibi bir diziye gitmek istiyorum:

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

Ama ben diziye bu verileri dönüştürmek için nasıl sergiyi değilim.

Herhangi bir ipucu?

4 Cevap

Yani bu ağaç veri yapısını dönüştürmek istiyorum:

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

Düz bir dizi çeşit içine:

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

zor olurdu. Bu iyi answerers bir sürü yok klasik CS sorundur. Ağaç yapısı düz dizi ya da liste yok girişler arasındaki ilişkiler hakkında bilgi sağlar. Bir liste halinde ağacı düzleştirmek için her türlü girişimi olduğu başvuru bağlam kaybedecektir.

Ya dize patlayabilir ve sonra (tag2 bakınız) ana unsurları izleyebilmek veya onları görmezden yürüyebiliyordu. Ben xml ile bir şeyler yapmak zorunda eğer ben böyle bir şey üretmek hangi bir SimpleXMLElement içinde düşeceği:

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

Bu grubu ben foreach ile yürümek ve etiket bulmak ve içeriğini olabilir. Ben içeriği dizeleri veya alt öğeleridir ve eğer öyleyse onları yürümek olmadığını test edebilirsiniz. Bir recursive fonksiyon bu sorunun oldukça kısa çalışma yapacak. En büyük sorun bu düzleşir kez verileri temsil etmek için nasıl.

Eğer dizi örnekte içine düzleştirmek daha önce üst sağlanan ve çocuk etiketleri birbirlerine herhangi bir zımni ilişkisi gevşek. Bu büyük bir sorun değil, eğer. Özyinelemeli fonksiyon yazın ve bitirdiniz. İşte bazı psudocode olduğunu:

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.

Eğer bir şekilde bu ilişkileri sağlam tutmak gerekir Ancak eğer bir sorun biraz var ve bunun için düzeni çeşit hazırlamak için ihtiyacınız olacak

Basitçe:

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

Ancak bu (kullandığınız yani> ve http://www.w3.org/TR/REC-xml/#syntax

Otherwise I would look at the comments on the PHP.net page: http://us.php.net/manual/en/function.xml-parse.php

Tam olarak ne yapmaya çalışıyorsun? Eğer çözmeye çalıştığınız sorunun daha geniş bir resim verirseniz biz daha iyi bir çözüm vermek mümkün olabilir.

$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";
}
?>

Ben çözüm körüktür Bunu yapmanın daha iyi bir yolu understoud tvanover için sorun sayesinde üzgünüm.