我有一个问题类似于之前提到的类似这样的问题: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>' ;
?>
由于
答案 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