【问题标题】:PHP deepening XML structurePHP深化XML结构
【发布时间】:2010-01-21 10:57:12
【问题描述】:

给定以下 XML 结构(我在一个 XML 文件中有它,还有很多其他内容 - <p> 标签只是用来指示其他标签可能会跟随):

<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>

或者换句话说,有没有办法让更高级别的标题包含在较低级别的标题和它们后面的所有内容中,从而创建一个嵌套结构。每个 TITEL1,2 和 3 标签的内容应该进入一个新的&lt;TITEL&gt;-element

我已经在论坛的 XSLT 方面提出了同样的问题,但得到了尝试使用 c# 或 java 的建议。由于我不了解这些语言并且知道的比 PHP 的基础知识要多一些,所以我想尝试这种方式。谁能帮我上路?

【问题讨论】:

  • 作为附加问题 - 我如何使用 Java (JDOM / SAX) 做同样的事情?

标签: php xml iterative-deepening


【解决方案1】:

PHP 还具有非常好的内置 DOM 支持,您可以使用它来构建此类结构。开始记录有关此扩展程序的地方是 http://de2.php.net/dom

在您的情况下,您首先必须创建一个文档,然后使用 DOMDocument::createElement DOMElement::appendChild 将该元素附加到另一个元素

完成后,调用 DOMDocument::save 将 DOM 保存到指定文件中。

【讨论】:

  • 这其实是正确的做法。我不使用它的原因是因为我不需要完整的 DOM 支持,我通常只是从例如 sql 查询中提取数组,然后将它们传递给其他服务......投票赞成:)
【解决方案2】:

这是我不久前为此编写的一些代码:

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% 确定为什么第一个标签是缩进的,但它从来没有真正困扰过我。

【讨论】:

  • 另外,如果您查看文档,有一种方法可以将 xml 转换为数组。
  • 你好 Jolierouge。据我所知,您的代码将已经具有所需结构的数组转换为 xml 代码。我正在寻找的是一种将更高级别的 TITEL 元素包装在较低级别的元素周围的方法(参见我的示例)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多