2010-01-21 5 views
2

дается следующая структура XML (у меня есть это в XML-файле, с большим количеством другого содержания - в <p> теги только там, чтобы указать, что другие теги могут следовать):PHP структура углубление XML

<TITEL1>...</TITEL1> 
<p>..</p> 
<TITEL2>...</TITEL2> 
<TITEL3>...</TITEL3> 
<TITEL3>...</TITEL3> 
<P>...<P> 

есть способ, чтобы добраться до этого с помощью PHP (записать его в новый файл):

<TITEL1> 
    <TITEL>...</TITEL> 
    <p>...</p> 
    <TITEL2> 
     <TITEL>...</TITEL> 
     <TITEL3> 
      <TITEL>...</TITEL> 
      <P>...</P> 
     </TITEL3> 
     <TITEL3> 
      <TITEL>...</TITEL> 
      <P>...</P> 
     </TITEL3> 
    </TITEL2> 
</TITEL1> 

или другими словами, есть ли способ, чтобы иметь более высокий уровень titels окружать нижний уровень titels и все содержимое, которое следует за ними , тем самым создавая вложенную структуру. Содержание каждого тега TITEL1,2 и 3 должно входить в новый <TITEL>-элемент

Я уже задал тот же вопрос на стороне XSLT форума, но получил совет попробовать C# или java. Поскольку я не знаю эти языки и знаю несколько больше, чем основы PHP, я думал о том, чтобы попробовать это. Может ли кто-нибудь посадить меня на моем пути?

+0

В качестве дополнительного вопроса - как я могу сделать то же самое с помощью Java (JDOM/SAX)? – futureelite7

ответ

2

PHP также имеет очень хорошо встроенную поддержку DOM, которую вы можете использовать для построения таких структур. Место для начала документирования этого расширения будет http://de2.php.net/dom.

В вашем случае, вы должны сначала создать документ затем использовать DOMDocument :: createElement DOMElement :: AppendChild, чтобы добавить этот элемент к другому элементу

После того как вы сделали, вызовите DOMDocument :: сохранить, чтобы сохранить DOM в указанный файл.

+0

Это на самом деле правильный способ сделать это. Причина, по которой я не использую это, заключается в том, что мне не нужна полная поддержка DOM, обычно я просто вырываю массивы из, например, запроса sql, а затем передаю их на какую-то другую услугу ... Voted up :) –

0

Вот некоторый код, который я написал некоторое время назад именно для этого:

function array2xml($array) { 
    static $index = 0; 
    $pre = ''; 
    for ($i = 0; $i < $index;$i++) { 
     $pre .= "\t"; 
    } 
    $text = ''; 
    if (is_array($array)){ 
     foreach ($array as $k=>$v) { 
      if (is_int($k)){ 
       if (is_array($v)){ 
        $text = $text . array2xml($v); 
       } 
      } else if (is_string($k)){ 
       if (!is_array($v)){ 
        $text .= "$pre<$k>$v</$k>\n"; 
       } else if (is_array($v)) { 
        $index++; 
        $text .= "$pre<$k>\n".array2xml($v)."$pre</$k>\n"; 
        $index--; 
       } 
      } else { 
       if (is_array($v)){ 
        $index++; 
        $text .= array2xml($v); 
        $index--; 
       } 
      } 
     } 
     return "$text"; 
    } else { 
     return $text . $array; 
    } 
} 
$a = array(
    "hello" => array(
     "world" => " Yay!", 
    ), 
    "messages" => array(
     array(
      array(
       "message" => "Goodby cruel world!" 
      ), 
      "message" => array(
       "text1" => "Yo", 
       "text2" => "dude!", 
      ), 
     ) 
    ), 
); 
echo array2xml($a); 

, который выводит это:

<hello > 
    <world> Yay!</world> 
</hello> 
<messages > 
    <message>Goodby cruel world!</message> 
    <message > 
     <text1>Yo</text1> 
     <text2>dude!</text2> 
    </message> 
</messages> 

Не 100% уверены, почему первый тег отступа, но это никогда не беспокоило меня ,

+0

Кроме того, если вы посмотрите на документацию, есть способ конвертировать xml в массив. –

+0

Привет, Jolierouge. Насколько я могу сказать, ваш код преобразует массив, который уже имеет желаемую структуру в xml-код. То, что я ищу, - это способ обернуть элементы TITEL более высокого уровня вокруг более низких уровней (см. Мой пример) – AZtec