XML Datensatz erstellen mit CDATA Werten und Ausgabe

In einem XML Objekt müssen Daten, welche html Codes, bzw. Tags enthalten in einem <![CDATA[*Text*]] Block untergebracht werden.

In dem Skript wird die SimpleXMLElement Klasse um die Methode addCData erweitert. Mit einer simplen Abfrage text != strip_tags( text ) wird entschieden, ob der Wert in einen CDATA Block gepackt werden muss.

Das Kaufmännische Und (&) wird in diesem Skript auch maskiert.

// Danke an https://stackoverflow.com/a/6260295/8148987
// Um CDATA Block hinzuzufügen
class SimpleXMLExtended extends SimpleXMLElement {
	public function addCData( $cdata_text ) {
		$node = dom_import_simplexml( $this );
		$no   = $node->ownerDocument;
		$node->appendChild( $no->createCDATASection( $cdata_text ) );
	}
}

// Test Array
	$test = array(
		"field1" => "Einfacher String",
		"field2" => "<a href='#test'>String mit HTML Code & kaufmännisches Und und maskiert &amp;</a>",
		"field3" => "< & &amp; && > Maskierung Test",
		"field4" => "123"
	);

// Create XML Object
	$xml = new SimpleXMLExtended( "<dataset />" ); // Aufruf modifiziertes SimpleXMLElement

	$single = $xml->addChild( "single" );

	foreach ( $test as $colname => $value ) {

		if ( $value != strip_tags( $value ) ) // Prüfe ob String HTML Code, bzw. Tags enthält. Danke an https://stackoverflow.com/a/5732812/8148987
		{
			$single_child = $single->addChild( $colname );
			$single_child->addCData( $value );

		} else {
			$value_ampersand_escape = preg_replace("/&(?!.{2,4};)/", "&amp;", $value); // Kaufmännisches Und maskieren. Danke an https://stackoverflow.com/a/24340260/8148987
			$single->addChild( $colname, $value_ampersand_escape );
		}
	}


// Display XML Code
	$dom                     = new DOMDocument( '1.0', "utf-8" );
	$dom->preserveWhiteSpace = false;
	$dom->formatOutput       = true;
	$dom->loadXML( $xml->asXML() );
	header( "Content-Type: application/xml; charset=utf-8" );

	echo $dom->saveXML();

Die Ausgabe:

// Output:
<?xml version="1.0"?>
<dataset>
  <single>
    <field1>Einfacher String</field1>
    <field2><![CDATA[<a href='#test'>String mit HTML Code & kaufmännisches Und und maskiert &amp;</a>]]></field2>
    <field3>&lt; &amp; &amp; &amp;&amp; &gt; Maskierung Test</field3>
    <field4>123</field4>
  </single>
</dataset>

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*
*
*