2009-10-30 6 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

Вы спрашиваете нас, как использовать молоток для приведения винта. Другими словами, вместо того, чтобы описывать, как вы хотите что-то делать, спросите о * how *, чтобы делать что-то. Почему вы хотите иметь такой массив несоответствующих тегов? –

+0

Да, похоже, вы пытаетесь сгладить структуру данных во что-то другое. –

ответ

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 
) 

С этим я могу пройти его с Еогеасп и выяснить, тег и его содержимое. Я могу проверить, являются ли содержимое строками или дочерними элементами, и если они их прогуливают. Рекурсивная функция сделает довольно короткую работу по этой проблеме. Самая большая проблема заключается в том, как представлять данные, как только они сглаживаются.

Если вы сгладили его в примере массива, который я предоставил ранее, родительский и дочерний теги освобождают любые подразумеваемые отношения друг к другу. Если это не проблема, отлично. Напишите рекурсивную функцию, и все готово. Вот некоторые 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

Я пытаюсь показать, что вы показали, моя проблема связана с конечными тегами на данный момент, xml построен ранее с php DomDocument. –

2

Просто:

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

Однако это предполагает выборку заданного является точным представлением вашего XML (т.е. вы используете > и < внутри блоков тегов) и не принимая во внимание CDATA блоков или комментариев XML. http://www.w3.org/TR/REC-xml/#syntax

В противном случае я хотел бы посмотреть на комментарии на странице PHP.net: http://us.php.net/manual/en/function.xml-parse.php

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. Я понимаю, что это лучший способ сделать это.