Vor ein paar Tagen stellte sich mir bzw. stellte ich mir die Frage,
wie man mit SimpleXMLElement CDATA und Comment Sections erzeugen kann.
Kurz und gut, hier ist das Ergebnis in Form einer Klasse:
* @access public
*/
class XmlSimple {
/**
* creates new SimpleXML object with named root node
* @param string $sRoot name of root node
* @return object SimpleXMLElement
*/
public static function createRoot($sRoot) {
return simplexml_load_string('< ' . $sRoot . '/>', null, LIBXML_NOCDATA);
}
/**
* creates new SimpleXML object from XML string not ignoring CDATA
* @param string $sXml XML
* @return object SimpleXMLElement
*/
public static function fromString($sXml) {
return simplexml_load_string($sXml, null, LIBXML_NOCDATA);
}
/**
* creates new SimpleXML object from XML file not ignoring CDATA
* @param string $sXml XML file
* @return object SimpleXMLElement
*/
public static function fromFile($sFile) {
return simplexml_load_file($sFile, null, LIBXML_NOCDATA);
}
/**
* creates new SimpleXML object from XML URL not ignoring CDATA
* @param string $sUrl URL location
* @return object SimpleXMLElement
*/
public static function fromUrl($sUrl) {
return new SimpleXMLElement($sUrl, LIBXML_NOCDATA, true);
}
/**
* appends new named SimpleXMLElement with CDATA section
* @param object $oParent SimpleXMLElement parent
* @param string $sName name of new SimpleXMLElement child
* @param string $sValue CDATA value
* @return object SimpleXMLElment as modified $oParent
*/
public static function addCDataChild($oParent, $sName, $sValue) {
$oNodeOld = dom_import_simplexml($oParent);
$oNodeNew = new DOMNode();
$oDom = new DOMDocument();
$oDataNode = $oDom->appendChild($oDom->createElement($sName));
$oDataNode->appendChild($oDom->createCDATASection($sValue));
$oNodeTarget = $oNodeOld->ownerDocument->importNode($oDataNode, true);
$oNodeOld->appendChild($oNodeTarget);
return simplexml_import_dom($oNodeTarget);
}
/**
* appends new named SimpleXMLElement with comment data
* @param object $oParent SimpleXMLElement parent
* @param string $sName name of new SimpleXMLElement child
* @param string $sValue comment dats
* @return object SimpleXMLElment as modified $oParent
*/
public static function addCommentChild($oParent, $sName, $sValue) {
$oNodeOld = dom_import_simplexml($oParent);
$oDom = new DOMDocument();
$oDataNode = $oDom->appendChild($oDom->createElement($sName));
$oDataNode->appendChild($oDom->createComment($sValue));
$oNodeTarget = $oNodeOld->ownerDocument->importNode($oDataNode, true);
$oNodeOld->appendChild($oNodeTarget);
return simplexml_import_dom($oNodeTarget);
}
/**
* @deprecated
* @see SimpleXMLElement::addChild
* @param object $oParent SimpleXMLElement parent
* @param string $sName name of new SimpleXMLElement child
* @param string $sValue dats
* @return object SimpleXMLElment of new created child
*/
public static function addChild($oParent, $sName, $sValue = false) {
$oNodeOld = dom_import_simplexml($oParent);
$oDom = new DOMDocument();
$oCreatedNode = (empty ($sValue)) ? $oDom->createElement($sName) : $oDom->createElement($sName, $sValue);
$oNodeTarget = $oNodeOld->ownerDocument->importNode($oCreatedNode, true);
$oNodeOld->appendChild($oNodeTarget);
return simplexml_import_dom($oNodeTarget);
}
/**
* @deprecated
* @see SimpleXMLElement::addAttribute
* @param object $oParent SimpleXMLElement object
* @param string $sName atrribute name
* @param string $sValue attribute value
* @return object SimpleXMLElment as $oParent
*/
public static function addAttribute($oParent, $sName, $sValue = '') {
$oNode = dom_import_simplexml($oParent);
$oNode->setAttribute($sName, $sValue);
return simplexml_import_dom($oNode);
}
}
?>
Hallo Holger,
deine Klasse kommt mir gerade sehr gelegen und ist wirklich praktisch, wenn man XML erzeugen will.
In Zeile 14 ist jedoch ein Fehler:
return simplexml_load_string('< ' . $sRoot . '/>', null, LIBXML_NOCDATA);
Sollte sein:
return simplexml_load_string('<' . $sRoot . '/>', null, LIBXML_NOCDATA);
Ansonsten gibt es eine nette Sammlung von Fehlermeldungen 😉