在尝试美化XML字符串输出时如何忽略SimpleXML错误

时间:2016-07-08 13:32:44

标签: php xml xml-parsing simplexml

我有一个问题类似于之前提到的类似这样的问题:How to parse an XML ignoring errors with SimpleXML

我已经制作了代码,使用SimpleXMLElement很好地缩进XML输出并使用字符串播放,当我有有效的XML时它会起作用,但是每当我得到错误的xml文件时我都会收到错误...

示例:

fafjdsj kfčasdkf dflčakč <?xml .... ENVELOPE> dsjkaljdlk <?xml .. fdsfsa.. ENVELOPE> sdfadf

所以基本上我有一个多个xml的混合字符串在一个和xml之间的一些随机单词(可以在xml内部或两者之间,如示例中所示......)

有没有可能的解决方案?

我的代码(https://jsfiddle.net/72ygv2sb/):

<?php
$xml = 'opdfeakfjlčfkajf laesfa lfje akljč <?xml version="1.0" encoding="utf-8"?>dsfsadf<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></soapenv:Body> </soapenv:Envelope> faskfjasdf jdalkfj sdklfa alk <?xml version="1.0" encoding="utf-8"?>dsfsadf<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></soapenv:Body></soapenv:Envelope>';


function xmlpp($xml, $html_output=false) {   

    #$xml = explode("\n", preg_replace('/>\s*\n<"', $xml)); 

    $xml_obj = new SimpleXMLElement($xml);
    $level = 4;
    $indent = 0; // current indentation level
    $pretty = array();

    // get an array containing each XML element
    $xml = explode("\n", preg_replace('/>\s*</', ">\n<", $xml_obj->asXML()));

    // shift off opening XML tag if present
    if (count($xml) && preg_match('/^<\?\s*xml/', $xml[0])) {
        $pretty[] = array_shift($xml);
    }

    foreach ($xml as $el) {
      if (preg_match('/^<([\w])+[^>\/]*>$/U', $el)) {
          // opening tag, increase indent
          $pretty[] = str_repeat(' ', $indent) . $el;
          $indent += $level;
      } else {
        if (preg_match('/^<\/.+>$/', $el)) {            
          $indent -= $level;  // closing tag, decrease indent
        }
        if ($indent < 0) {
          $indent += $level;
        }
        $pretty[] = str_repeat(' ', $indent) . $el;
      }
    }   
    $xml = implode("\n", $pretty);   
    return ($html_output) ? htmlentities($xml) : $xml;
}

echo '<pre>' . xmlpp($xml, true) . '</pre>' ; 
?>

由于

1 个答案:

答案 0 :(得分:0)

IMSoP解决的问题

替换 $ xml = explode(&#34; \ n&#34;,preg_replace(&#39; /&gt; \ s * \ n&lt;&#34;,$ xml_obj-&gt; asXML()));

使用$ xml = explode(&#34; \ n&#34;,preg_replace(&#39; /&gt; \ s * \ n&lt;&#34;,$ xml));.

完全删除了$ xml_obj变量。现在即使它有错误,也可以获得完美编辑的xml