php dom create element but self-closing

I want to create a html block, like this:

<media>
    <media-reference source='15.jpg' />
    <media-caption>caption</media-caption>
    <hasSyndicationRights>1</hasSyndicationRights>
    <licenseId>1</licenseId>
    <licensorName>name</licensorName>
</media>

But in my code <media-reference> closes like this </media-reference>.

How can I close just that tag?

This is my code:

$valFieldBody = '<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odio labore aut hic soluta! Animi quaerat unde commodi minus dicta, a quidem. Soluta quaerat delectus, id, dolor ex placeat molestiae quae.</p><p><img  height="500" src="15.jpg" width="500"/></p>';
$htmlEncoded = mb_convert_encoding($valFieldBody, 'HTML-ENTITIES', 'UTF-8');
$doc = new DOMDocument;
$opcionesLibXML = LIBXML_COMPACT | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD;
libxml_use_internal_errors(true);
@$doc->loadHTML($htmlEncoded, $opcionesLibXML);
libxml_use_internal_errors(false);

$img_tag = $doc->getElementsByTagName('img');

foreach ($img_tag as $key => $img_items){
    $img_src = $img_items->getAttribute('src');
    $tag_media = $doc->createElement('media');
    $tag_media_reference = $doc->createElement('media-reference');
    $tag_media_reference->setAttribute('mime-type','image/jpg');
    $tag_media_reference->setAttribute('source',$img_src);
    $tag_media_caption = $doc->createElement('media-caption',$img_title);
    $tag_hasSyndicationRights = $doc->createElement('hasSyndicationRights','1');
    $tag_licenseId = $doc->createElement('licenseId','1');
    $tag_licensorName = $doc->createElement('licensorName',$img_title);
    $tag_media->appendChild($tag_media_reference);
    $tag_media->appendChild($tag_media_caption);
    $tag_media->appendChild($tag_hasSyndicationRights);
    $tag_media->appendChild($tag_licenseId);
    $tag_media->appendChild($tag_licensorName);
    $img_items->parentNode->replaceChild($tag_media, $img_items);
}
$valFieldBody = $doc->saveHTML($doc->documentElement);

For now I'm using str_replace to change that:

$valFieldBody = str_replace("></media-reference>"," />", $valFieldBody);

Answer

Solution:

The problem is that saveHTML() is creating the output using it's own rules (as far as I can tell) and doesn't always write things according to XHTML standards. If instead you write it out using saveXML() you should get a more standard output

$valFieldBody = $doc->saveXML($doc->documentElement);

which gives...

<p>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odio labore
    aut hic soluta! Animi quaerat unde commodi minus dicta, a quidem.
    Soluta quaerat delectus, id, dolor ex placeat molestiae quae.
    <p>
        <media>
            <media-reference mime-type="image/jpg"
                source="15.jpg" />
            <media-caption>abcd</media-caption>
            <hasSyndicationRights>1</hasSyndicationRights>
            <licenseId>1</licenseId>
            <licensorName>abcd</licensorName>
        </media>
    </p>
</p>

(Note that saving as XML may actually cause other problems if your original source isn't XHTML)

Source