public function toXML(\DOMNode $parentElement = null)
{
if ($parentElement === null) {
$document = DOMDocumentFactory::create();
$parentElement = $document;
} else {
$document = $parentElement->ownerDocument;
}
$root = $document->createElementNS(Constants::NS_SAML, 'saml:' . 'Assertion');
$parentElement->appendChild($root);
/* Ugly hack to add another namespace declaration to the root element. */
$root->setAttributeNS(Constants::NS_SAMLP, 'samlp:tmp', 'tmp');
$root->removeAttributeNS(Constants::NS_SAMLP, 'tmp');
$root->setAttributeNS(Constants::NS_XSI, 'xsi:tmp', 'tmp');
$root->removeAttributeNS(Constants::NS_XSI, 'tmp');
$root->setAttributeNS(Constants::NS_XS, 'xs:tmp', 'tmp');
$root->removeAttributeNS(Constants::NS_XS, 'tmp');
$root->setAttribute('ID', $this->id);
$root->setAttribute('Version', '2.0');
$root->setAttribute('IssueInstant', gmdate('Y-m-d\\TH:i:s\\Z', $this->issueInstant));
if (is_string($this->issuer)) {
$issuer = Utils::addString($root, Constants::NS_SAML, 'saml:Issuer', $this->issuer);
} elseif ($this->issuer instanceof \SAML2\XML\saml\Issuer) {
$issuer = $this->issuer->toXML($root);
}
$this->addSubject($root);
$this->addConditions($root);
$this->addAuthnStatement($root);
if ($this->requiredEncAttributes == false) {
$this->addAttributeStatement($root);
} else {
$this->addEncryptedAttributeStatement($root);
}
if ($this->signatureKey !== null) {
Utils::insertSignature($this->signatureKey, $this->certificates, $root, $issuer->nextSibling);
}
return $root;
}