2010-01-21 42 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> -element

我已经在论坛的XSLT端提出了同样的问题,但得到了建议尝试使用c#或java。由于我不知道这些语言,并且比PHP的基础知识略懂,所以我想这样做。任何人都可以在我的路上设置我吗?

+0

作为一个附加问题 - 如何使用Java(JDOM/SAX)做同样的事情? – futureelite7 2010-01-21 11:01:27

回答

2

PHP也有很好的内置DOM支持,您可以使用它来构建这样的结构。开始记录此扩展名的地方是http://de2.php.net/dom

在你的情况,你首先要创建一个文档,然后使用DOM文档::的createElement一个DOMElement ::使用appendChild将该元素追加到另一个元素

大功告成之后,调用DOM文档保存::保存DOM到指定的文件。

+0

这实际上是正确的方法。我不使用这个的原因是因为我不需要完整的DOM支持,我通常只是将数组从一个SQL查询中解脱出来,然后将它们传递给其他服务...投给了:) – 2010-01-21 13:31:02

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转换为数组。 – 2010-01-21 13:10:38

+0

嗨Jolierouge。据我可以告诉你的代码将已经具有所需结构的数组转换为xml代码。我在寻找的是一种包装更低层次TITEL元素的方法(请参阅我的示例) – AZtec 2010-01-22 11:32:19