2009-10-30 135 views
1

我需要發送HTML字符串有像 <total> <tag>content</tag> <tag2 ref="333"> <code>somecode</code> <code>morecode</code> </tag2> <tag3> more code </tag3> </total>PHP的SimpleXML元素陣列

這將進入像一個數組:

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

但我不搞清楚如何改造這個數據傳遞給數組。

任何提示?

+0

你在問我們如何用錘子來驅動螺絲。換句話說,不要描述你想做什麼事情,而是要詢問如何做事情。爲什麼你想要有這樣一組不匹配的標籤? – 2009-10-30 22:11:04

+0

是的,它似乎確實想要將數據結構扁平化爲其他東西 – 2009-11-03 23:07:14

回答

2

所以,你要這棵樹的數據結構轉換:

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

成某種平板陣列的:

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

將是棘手的。這是一個經典的CS問題,沒有很多好的回答者。樹結構提供了關於平面數組或列表不包含的條目之間的關係的信息。任何試圖將樹平鋪到列表中的操作都會失去參考上下文。

您可以將字符串分解,然後遍歷它以跟蹤父元素或忽略它們(請參閱tag2)。如果我不得不做的事XML我會放棄它在一個SimpleXMLElement,這會產生這樣的:

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

有了這個,我可以用foreach走,並找出標籤和它的內容。我可以測試一下,看看內容是字符串還是子元素,如果是這樣的話。遞歸函數會使這個問題變得相當短暫。最大的問題是如何在數據變平時表示數據。

如果你將它壓扁到前面提供的數組示例中,那麼父和子標籤之間就會有任何隱含的關係。如果這不是問題,那很好。編寫遞歸函數,就完成了。下面是一些psudocode:

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. 

不過,如果你需要以某種方式讓那些關係完好你有一點問題,需要設計出某種方案爲

+0

我正在嘗試展示您的內容,此時我的問題是處理結束標記,此前使用php DomDocument構建了xml。 – 2009-11-01 17:52:53

2

究竟是什麼你想怎麼辦?如果您對您嘗試解決的問題有更全面的瞭解,我們可能會提供更好的解決方案。

0

如果你從數據一個文件,然後file()函數會給你一個一行一行的數組。 可能是最簡單的方法!

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

對不起,謝謝tvanover我沒有更好的方法做到這一點解決方案是波紋管。