2016-07-08 49 views
0

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

+0

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

+0

Es muss XML-String sein, wie wir Xml-Daten vom Server als String ziehen – Antonio

+0

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

Antwort

0

Anfrage von IMSoP gelöst

$ xml ersetzt = explode ("\ n", preg_replace ('/> \ s * \ n <“, $ xml_obj-> asXML()));

mit $ xml = Explodieren ("\ n", preg_replace ('/> \ s * \ n <“, $ xml)) ;.

Die Variable $ xml_obj wurde vollständig entfernt. Vollkommen schön editted xml jetzt auch tho es hat Fehler drin