【问题标题】:format xml string格式化xml字符串
【发布时间】:2011-04-06 16:52:42
【问题描述】:

在 PHP 类中格式化 XML 的最佳方法是什么。

$xml = "<element attribute=\"something\">...</element>";

$xml = '<element attribute="something">...</element>';

$xml = '<element attribute=\'something\'>...</element>';

$xml = <<<EOF
<element attribute="something">
</element>
EOF;

我很确定这是最后一个!

【问题讨论】:

  • 我不确定你在问什么。你想用一些 php 类来构建 xml 吗?
  • 恐怕这不是一个真正的 XML。
  • 这是一个用于信用卡支付的网络服务调用,其中一些参数是金额/客户地址的 XML,金额可以硬编码,因为它是恒定的,我将输入该 XML在我的 php 类中
  • 如果它是一个网络服务,那么你不需要关心任何格式。仅当您需要向人类提供 XML 以使其更易于阅读和创作时,格式化才有用。机器不在乎。

标签: php xml string


【解决方案1】:

DOM 你可以做到

$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML('<root><foo><bar>baz</bar></foo></root>');
$dom->formatOutput = TRUE;
echo $dom->saveXML();

给 (live demo)

<?xml version="1.0"?>
<root>
  <foo>
    <bar>baz</bar>
  </foo>
</root>

参见DOMDocument::formatOutputDOMDocument::preserveWhiteSpace 属性说明。

【讨论】:

    【解决方案2】:

    这个函数可以完美地工作,因为你不需要使用任何 xml dom 库,或者只需将 xml 生成的字符串传递给它,它就会解析并生成带有制表符和换行符的新字符串。

    function formatXmlString($xml){
        $xml = preg_replace('/(>)(<)(\/*)/', "$1\n$2$3", $xml);
        $token      = strtok($xml, "\n");
        $result     = '';
        $pad        = 0; 
        $matches    = array();
        while ($token !== false) : 
            if (preg_match('/.+<\/\w[^>]*>$/', $token, $matches)) : 
              $indent=0;
            elseif (preg_match('/^<\/\w/', $token, $matches)) :
              $pad--;
              $indent = 0;
            elseif (preg_match('/^<\w[^>]*[^\/]>.*$/', $token, $matches)) :
              $indent=1;
            else :
              $indent = 0; 
            endif;
            $line    = str_pad($token, strlen($token)+$pad, ' ', STR_PAD_LEFT);
            $result .= $line . "\n";
            $token   = strtok("\n");
            $pad    += $indent;
        endwhile; 
        return $result;
    }
    

    【讨论】:

    【解决方案3】:

    //这里是使用XMLWriter的例子

    $w = new XMLWriter;
    $w->openMemory();
    $w->setIndent(true);
      $w->startElement('foo');
        $w->startElement('bar');
          $w->writeElement("key", "value");
        $w->endElement();
      $w->endElement();
    echo $w->outputMemory();
    

    //输出

    <foo> 
     <bar> 
      <key>value</key> 
     </bar> 
    </foo> 
    

    【讨论】:

    • 顺便说一句,XMLWriter 比 DOM 功能好?不过看起来更好。
    【解决方案4】:

    如果您打算将值嵌入到 XML 中,第一个更好,第二个更适合人类阅读。如果您打算真正使用 XML,那么两者都不好。

    但是,如果您打算执行一个将 XML 作为输入参数的简单触发函数,那么我会说使用第一种方法,因为您需要在某些时候嵌入参数。

    我个人会使用 PHP 类 simplexml,它非常易于使用,而且它内置的 xpath 支持使得详细说明以 XML 形式返回的数据成为一种梦想。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多