2009-06-27 3 views
3

Ich verwende SimpleXML und Xpath, um Elemente aus einem externen UTF-8 XHTML-Dokument zu lesen. Ich wiederhole dann iterativ die Ausgabe der SimpleXML-Funktion asXML(), die bei jedem Element ausgeführt wird, das von einem Xpath-Selektor zurückgegeben wird. Aber die XML-Wagenrücklaufeinheit ist lästig eingefügt nach jeder Zeile meines Codes. Es gibt keine zusätzlichen Zeichen im XHTML-Dokument. Was verursacht das? Es scheint die Art und Weise zu sein, wie ich bin Iteration durch jedes Array-Element von xpath zurückgegeben. Ich bekomme die Entitäten nicht, wenn ich nur ein Element direkt aus SimpleXML asXML() ausgabe (ohne Xpath). PHP: Auto-generierte XML Carriage Return Entities erscheinen mit SimpleXML und Xpath

<?php 
$content = new DOMDocument(); 
$content->loadHTMLFile(CONTENT.html); 
$story = simplexml_import_dom($content->getElementById('story')); 
$topics = $story->xpath('div[@class="topic"]'); 
foreach ($topics as $topic) { 
    $topicContents = $topic->xpath('div/child::node()'); // Array of elements within 'content'. 
    foreach ($topicContents as $contentElement) { 
     echo $contentElement->asXML(); 
    } 
} 
?> 

Auszug aus ausgegebenen XHTML-Code mit automatisch generierten XML-Zeilenumbrüche:

<div class="content">&#13; 
<p>Lorem ipsum dolor sit amet</p>&#13; 
<h2>Lorem ipsum</h2>&#13; 
<p>Lorem ipsum dolor sit amet</p>&#13; 
<ul> 
    <li>Lorem ipsum</li>&#13; 
    <li>Lorem ipsum</li>&#13; 
    <li>Lorem ipsum</li>&#13; 

Antwort

2

Das ist, wie Libxml behandelt \ r in Textknoten.

<?php 
$xml = <<< XML 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html lang="en"> 
    <head> 
     <title>...</title> 
    </head> 
    <body><pre>a\nb\r\nc</pre></body> 
</html> 
XML;
$content = new DOMDocument(); $content->loadhtml($xml); $content = simplexml_import_dom($content); echo $content->asxml();
druckt
<html lang="en"><head><title>...</title></head><body><pre>a 
b&#13; 
c</pre></body></html>
(die \ n Zeichen „allein gelassen“, während die \ r \ n als & # behandelt wird 13; \ n)
Ich bin kein XML-Experte, aber ich denke, nach http://www.w3.org/TR/REC-xml/#sec-line-ends
Um die Vereinfachung Aufgaben von Anwendungen, der XML-Prozessor muss sich so verhalten, als ob er alle Zeilenumbrüche in externen geparsten Entitäten (einschließlich der Dokumententität) bei der Eingabe vor dem Parsen normalisierte, indem er sowohl die zweistellige Sequenz #xD #xA als auch jede #xD, die ist, übersetzt nicht gefolgt von #xA zu einem einzelnen Zeichen #xA.
sollte es das \ r \ n wie ein einzelnes behandeln \ n aber es tut es nicht.
Wenn es dir nicht ernsthafte Probleme verursacht, lebe einfach damit ...