1

When I use DOMDocument in PHP file, I get the following errors:

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag nodes line 7 in Entity, line: 7 in D:\wamp\www\dom1.php on line 77

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag node line 6 in Entity, line: 7 in D:\wamp\www\dom1.php on line 77

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag field line 5 in Entity, line: 7 in D:\wamp\www\dom1.php on line 77

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag field line 5 in Entity, line: 7 in D:\wamp\www\dom1.php on line 77

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag field line 4 in Entity, line: 7 in D:\wamp\www\dom1.php on line 77

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag field line 4 in Entity, line: 7 in D:\wamp\www\dom1.php on line 77

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag node line 3 in Entity, line: 7 in D:\wamp\www\dom1.php on line 77

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag node line 2 in Entity, line: 7 in D:\wamp\www\dom1.php on line 77

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag node line 2 in Entity, line: 7 in D:\wamp\www\dom1.php on line 77

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag nodes line 1 in Entity, line: 7 in D:\wamp\www\dom1.php on line 77 array(0) { }

The php code is as follows:

<?php
class MyDOMDocument extends DOMDocument
{
    public function toArray(DOMNode $oDomNode = null)
    {
        // return empty array if dom is blank
        if (is_null($oDomNode) && !$this->hasChildNodes()) {
            return array();
        }
        $oDomNode = (is_null($oDomNode)) ? $this->documentElement : $oDomNode;
        if (!$oDomNode->hasChildNodes()) {
            $mResult = $oDomNode->nodeValue;
        } else {
            $mResult = array();
            foreach ($oDomNode->childNodes as $oChildNode) {
                // how many of these child nodes do we have?
                // this will give us a clue as to what the result structure should be
                $oChildNodeList = $oDomNode->getElementsByTagName($oChildNode->nodeName); 
                $iChildCount = 0;
                // there are x number of childs in this node that have the same tag name
                // however, we are only interested in the # of siblings with the same tag name
                foreach ($oChildNodeList as $oNode) {
                    if ($oNode->parentNode->isSameNode($oChildNode->parentNode)) {
                        $iChildCount++;
                    }
                }
                $mValue = $this->toArray($oChildNode);
                $sKey   = ($oChildNode->nodeName{0} == '#') ? 0 : $oChildNode->nodeName;
                $mValue = is_array($mValue) ? $mValue[$oChildNode->nodeName] : $mValue;
                // how many of thse child nodes do we have?
                if ($iChildCount > 1) {  // more than 1 child - make numeric array
                    $mResult[$sKey][] = $mValue;
                } else {
                    $mResult[$sKey] = $mValue;
                }
            }
            // if the child is <foo>bar</foo>, the result will be array(bar)
            // make the result just 'bar'
            if (count($mResult) == 1 && isset($mResult[0]) && !is_array($mResult[0])) {
                $mResult = $mResult[0];
            }
        }
        // get our attributes if we have any
        $arAttributes = array();
        if ($oDomNode->hasAttributes()) {
            foreach ($oDomNode->attributes as $sAttrName=>$oAttrNode) {
                // retain namespace prefixes
                $arAttributes["@{$oAttrNode->nodeName}"] = $oAttrNode->nodeValue;
            }
        }
        // check for namespace attribute - Namespaces will not show up in the attributes list
        if ($oDomNode instanceof DOMElement && $oDomNode->getAttribute('xmlns')) {
            $arAttributes["@xmlns"] = $oDomNode->getAttribute('xmlns');
        }
        if (count($arAttributes)) {
            if (!is_array($mResult)) {
                $mResult = (trim($mResult)) ? array($mResult) : array();
            }
            $mResult = array_merge($mResult, $arAttributes);
        }
        $arResult = array($oDomNode->nodeName=>$mResult);
        return $arResult;
    }
}

$sXml = <<<XML
<nodes>
    <node>text<node>
    <node>
        <field>hello<field>
        <field>world<field>
    <node>
<nodes>
XML;

$dom = new MyDOMDocument;
$dom -> loadXml($sXml);
var_dump($dom->toArray());
?>

source location: http://bd.php.net/manual/en/class.domdocument.php

2 Answers 2

3

You need to close the elements e.g. </node> and </field>

<nodes>
    <node>text<node>
<node>
    <field>hello<field>
    <field>world<field>
<node>
<nodes>

Change to:

<nodes>
    <node>text</node>
<node>
    <field>hello</field>
    <field>world</field>
</node>
</nodes>
Sign up to request clarification or add additional context in comments.

Comments

1

Change your XML into:

$sXml = <<<XML
<nodes>
    <node>text</node>
    <node>
        <field>hello</field>
        <field>world</field>
    </node>
</nodes>
XML;

Notice the pair <nodes></nodes>, <node></node>, <field></field>. You have to match every opened tag with it's closed tag. See w3Schools for more about XML.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.