php
  • xml
  • 2012-01-06 75 views -3 likes 
    -3

    可能重复:
    format xml stringXML源是凌乱

    我生成的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> 
    

    我该怎么做才能正确格式化和缩进?

    +0

    你为什么要发送内容类型html的XML? – 2012-01-06 19:55:35

    +0

    忽略,仅仅是一个输入错误 – tctc91 2012-01-07 12:23:06

    回答

    5

    使用\ r \ n或仅\ n字符添加换行符。您需要将您的字符串放在双引号(“”)中,以便它能够正常工作,所以或者用单引号(')替换字符串中的双引号,转义双引号(\“),添加。”\ r \ n”个作为断行或使用HEREDOC

    与像内置SimpleXML将阻止这些排序和许多其他类型的问题一个XML生成建立你的XML和通常比用手工构建它要容易得多字符串。

    +0

    +1表示heredoc。 – 2012-01-06 16:51:47

    +0

    +1表示heredoc。 – ThinkingMonkey 2012-01-06 17:50:32

    1

    $xmlpage后添加\n,你应该能够在echo后正常查看。

    例如

     $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"; 
    
    +0

    单引号字符串加'\ n'不能很好地一起玩...... – 2012-01-06 17:27:07

    +0

    基本的PHP语法:http://www.php.net/manual/en/language.types.string.php#language.types。 string.syntax.single – 2012-01-06 17:43:04

    +0

    哈哈,我不知道。我认为还有更多的东西。不过谢谢。 – ThinkingMonkey 2012-01-06 17:48:28

    2

    ,你可以:

    • 加入空格字符到您的字符串(\n\t)自己做。
    • 输出与HEREDOC
    • 所有的XML,您可以创建,甚至产生DOMDocument和使用saveXML()

    前两个是快速和肮脏(定界符的更好)。后者更健壮,但代码更多。

    +0

    Downvoter关心分享? – 2012-01-06 18:06:03

    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; 
    
    +0

    对于heredoc来说+1是个例子。 – 2012-01-06 16:57:57

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

    沿着这些线或根据您所需的输出的东西。

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

    虽然处理边缘案例的效率相对较高,但它效率并不高,因为它仅用于查看日志。

    +0

    XML + regex = [BAD](http://stackoverflow.com/a/1732454/118068) – 2012-01-06 17:28:00

    +0

    Marc,我不同意--XML是一个常规的数据结构,非常适合被正则表达式解析。在解析大型XML文档时,有时使用正则表达式会更快,而且它尝试解析整个文档时的内存肯定更少。 – 2012-01-06 17:31:08

    +0

    在一个完美的世界里,是的。但是非常频繁地发生了损坏的数据,并且对破坏性xml的正则表达式会使其更糟糕。总是防守编程。 – 2012-01-06 17:32:02

    1

    使用样式表和XML查看器来查看它。

    +0

    有点矫枉过正吧?即使在纯文本编辑器中,这样一个简单的XML也应该很容易查看。 – dtech 2012-01-06 16:56:31

    +0

    这是一个最佳实践,不管XML的复杂性(或缺乏)。这并不是特别困难 - 矫枉过正提出了一个轻量级工作的重量级工具,而XSLT不是一个重量级工具,也不是XML浏览器最近很难出现,所以不,我认为这不构成矫枉过正。 – 2012-01-06 23:35:52

    相关问题