PHP生成的XML源代码很乱

时间:2012-01-06 16:44:45

标签: php xml

  

可能重复:
  format xml string

我正在生成这样的XML页面:

            header('Content-Type: text/html');              

            $xmlpage = '<?xml version="1.0" charset="utf-8"?>';

            $xmlpage .= '<conv>';
            $xmlpage .= '<at>6 January 2012 12:00</at>';
            $xmlpage .= '<rate>1.56317</rate>';

            $xmlpage .= '<from>';
            $xmlpage .= '<code>'.$from.'</code>';
            $xmlpage .= '<curr>Pound Sterling</curr>';
            $xmlpage .= '<loc>UK</loc>';
            $xmlpage .= '<amnt>'.$amnt.'</amnt>';
            $xmlpage .= '</from>';

            $xmlpage .= '</conv>';

            echo $xmlpage;

查看页面源时,它看起来很糟糕:

 <?xml version="1.0" charset="utf-8"?><conv><at>6 January 2012 12:00</at><rate>1.56317</rate><from><code>USD</code><curr>Pound Sterling</curr><loc>UK</loc><amnt>23</amnt></from><to><code>GBP</code><curr>United States Dollar</curr><loc>USA</loc><amnt>14.73</amnt></to></conv>

如何才能使其正确格式化并缩进?

7 个答案:

答案 0 :(得分:5)

使用\ r \ n或仅\ n字符添加换行符。您需要将字符串放在双引号(“”)中才能使其正常工作,因此要么将字符串中的双引号替换为单引号('),要转义双引号(\“),添加。”\ r \ n“作为换行符或使用HEREDOC

使用内置SimpleXML等XML生成器构建XML将阻止这些排序和许多其他类型的问题,并且通常比使用字符串手动构建它更容易。

答案 1 :(得分:2)

你可以:

  • 通过在字符串中添加空格字符(\n\t)来自行完成。
  • 使用HEREDOC
  • 输出所有XML
  • 您可以创建甚至生成DOMDocument并使用saveXML()

前两个是快速而肮脏的(heredoc更好)。后者更强大,但代码更多。

答案 2 :(得分:1)

在每\n后添加$xmlpage。您应该能够在echo之后正确查看它。

e.g。

        $xmlpage = "<?xml version="1.0" charset="utf-8"?>\n";

        $xmlpage .= "<conv>\n";
        $xmlpage .= "<at>6 January 2012 12:00</at>\n";
        $xmlpage .= "<rate>1.56317</rate>\n";

答案 3 :(得分:1)

使用HEREDOC。它比重复的字符串连接更容易阅读,允许制表符/多行,并为您进行变量插值:

$xmlpage = <<<EOL
<?xml version="1.0" charset="utf-8"?>
<conv>
    <at>6 January 2012 12:00</at>
    <rate>1.56317</rate>
    <from>
        <code>$from</code>
        <curr>Pound Sterling</curr>
        <loc>UK</loc>
        <amnt>$amnt</amnt>
    </from>
</conv>
EOL;

答案 4 :(得分:1)

使用样式表和XML查看器进行查看。

答案 5 :(得分:-1)

最简单的方法是在字符串的开头添加适当的空格,并在结尾处添加换行符。

        $xmlpage = '<?xml version="1.0" charset="utf-8"?>';

        $xmlpage .= '<conv>' . "\n";
        $xmlpage .= "\t" . '<at>6 January 2012 12:00</at>' . "\n";
        $xmlpage .= "\t" . '<rate>1.56317</rate>' . "\n";

        $xmlpage .= '<from>' . "\n";
        $xmlpage .= "\t" . '<code>'.$from.'</code>' . "\n";
        $xmlpage .= "\t" . '<curr>Pound Sterling</curr>' . "\n";
        $xmlpage .= "\t" . '<loc>UK</loc>' . "\n";
        $xmlpage .= "\t" . '<amnt>'.$amnt.'</amnt>' . "\n";
        $xmlpage .= '</from>' . "\n";

        $xmlpage .= '</conv>';

或者沿着这些方向的东西,取决于你想要的输出。

答案 6 :(得分:-2)

这是我的美化功能,它为输出格式化。您可以根据自己的需要进行修改。

function prettifyXML( $xml )
{
    // Break our XML up into sections of newlines.
    $xml = preg_replace( '/(<[^\/][^>]*?[^\/]>)/', "\n" . '\1', $xml );

    $xml = preg_replace( '/(<\/[^\/>]*>|<[^\/>]*?\/>)/', '\1' . "\n", $xml );
    $xml = str_replace( "\n\n", "\n", $xml );

    $xml_chunks = explode( "\n", $xml );

    $indent_depth = 0;
    $open_tag_regex = '/<[^\/\?][^>]*>/';
    $close_tag_regex = '/(<\/[^>]*>|<[^>]*\/>)/';

    // Fix the indenting.
    foreach ( $xml_chunks as $index => $xml_chunk )
    {
        $close_tag_count = preg_match( $close_tag_regex, $xml_chunk );

        $open_tag_count = preg_match( $open_tag_regex, $xml_chunk );

        if ( $open_tag_count >= $close_tag_count )
        {
            $temp_indent_depth = $indent_depth;
        }
        else
        {
            $temp_indent_depth = $indent_depth - $close_tag_count;
        }

        $xml_chunks[ $index ] = str_repeat( "\t", $temp_indent_depth ) . $xml_chunk;

        $indent_depth += $open_tag_count - $close_tag_count;

    }

    $xml = implode( "\n", $xml_chunks );

    // Add tokens for attributes and values.
    $attribute_regex = '/([\w:]+\="[^"]*")/';
    $value_regex = '/>([^<]*)</';

    $value_span_token = '##@@##@@';
    $attribute_span_token = '@@##@@##';
    $span_close_token = '#@#@#@#@';

    $xml = preg_replace( $value_regex, '>' . $value_span_token . '\1' . $span_close_token . '<', $xml );
    $xml = preg_replace( $attribute_regex, $attribute_span_token . '\1' .$span_close_token, $xml );
    $xml = htmlentities( $xml );

    // Replace the tokens that we added previously with their HTML counterparts.
    $xml = str_replace( $value_span_token, '<span class="value">', $xml );
    $xml = str_replace( $attribute_span_token, '<span class="attribute">', $xml );
    $xml = str_replace( $span_close_token, '</span>', $xml );

    return $xml;
}

它处理边缘情况的测试相对较好,但效率不高,因为它仅用于查看日志。