Ich habe eine Frage zu beschönigen, die zuvor ähnlich ist gefragt Thread wie dieser: How to parse an XML ignoring errors with SimpleXMLWie SimpleXML Fehler zu ignorieren, wenn sie versuchen, XML-String Ausgabe
ich bereits Code XML-Ausgabe schön gegliederte mit SimpleXMLElement zu machen und spielen mit Streicher und es funktioniert, wenn ich gültige XML haben, aber ich erhalte eine Fehlermeldung, wenn ich schlechte XML-Datei ...
Beispiel erhalten:
fafjdsj kfčasdkf dflčakč <?xml .... ENVELOPE> dsjkaljdlk <?xml .. fdsfsa.. ENVELOPE> sdfadf
Also im Grunde ich eine gemischte Kette von mehreren XML ist in einen haben, und zwischen xml's einige r andom Wörter (kann innerhalb von xml sein oder zwischen den beiden wie im Beispiel ...)
Gibt es eine mögliche Lösung dafür?
Mein Code (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>' ;
?>
Dank
Ihr Code scheint nicht tatsächlich zu verwenden SimpleXML überhaupt, denn wenn ich es falsch lese, führen Sie effektiv $ xml_obj = new SimpleXMLElement ($ xml); $ xml = $ xml_obj-> asXML(); '. Kannst du das nicht einfach entfernen und deine Regex direkt auf die ursprüngliche nicht-wirklich-XML-Zeichenfolge anwenden? – IMSoP
Es muss XML-String sein, wie wir Xml-Daten vom Server als String ziehen – Antonio
Das beantwortet meine Frage überhaupt nicht. Ich sage, Sie können '$ xml = explode (" \ n ", preg_replace ('/> \ s *', "> \ n <", $ xml_obj-> asXML())); 'mit nur' $ xml = explode ersetzen ("\ n", preg_replace ('/> \ s *', "> \ n <", $ xml));'. Was ist der Zweck von $ xml_obj in diesem Code? – IMSoP