当我在PHP文件中使用DOMDocument时,出现以下错误:
警告:DOMDocument :: loadXML()[domdocument.loadxml]:实体中标记节点第7行中数据的过早结束,第7行中D:\ wamp \ www \ dom1.php中第7行:
警告:DOMDocument :: loadXML()[domdocument.loadxml]:实体中标记节点第6行中数据的过早结束,第7行中D:\ wamp \ www \ dom1.php中的行:7
警告:DOMDocument :: loadXML()[domdocument.loadxml]:实体中标记字段第5行中数据的过早结束,第7行中D:\ wamp \ www \ dom1.php中第7行:
警告:DOMDocument :: loadXML()[domdocument.loadxml]:实体中标记字段第5行中数据的过早结束,第7行中D:\ wamp \ www \ dom1.php中第7行:
警告:DOMDocument :: loadXML()[domdocument.loadxml]:实体中标记字段第4行中数据的过早结束,第7行中D:\ wamp \ www \ dom1.php中第7行
警告:DOMDocument :: loadXML()[domdocument.loadxml]:实体中标记字段第4行中数据的过早结束,第7行中D:\ wamp \ www \ dom1.php中第7行
警告:DOMDocument :: loadXML()[domdocument.loadxml]:实体中标记节点第3行中数据的过早结束,第7行中D:\ wamp \ www \ dom1.php中第7行
警告:DOMDocument :: loadXML()[domdocument.loadxml]:实体中标记节点第2行中数据的过早结束,第7行中D:\ wamp \ www \ dom1.php中第7行
警告:DOMDocument :: loadXML()[domdocument.loadxml]:实体中标记节点第2行中数据的过早结束,第7行中D:\ wamp \ www \ dom1.php中第7行
警告:DOMDocument :: loadXML()[domdocument.loadxml]:实体中标记节点第1行中数据的过早结束,第7行中D:\ wamp \ www \ dom1.php中第7行:7行 array(0){}
php代码如下:
<?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());
?>
答案 0 :(得分:3)
您需要关闭elements
,例如</node>
和</field>
<nodes>
<node>text<node>
<node>
<field>hello<field>
<field>world<field>
<node>
<nodes>
更改为:
<nodes>
<node>text</node>
<node>
<field>hello</field>
<field>world</field>
</node>
</nodes>
答案 1 :(得分:1)
将您的XML更改为:
$sXml = <<<XML
<nodes>
<node>text</node>
<node>
<field>hello</field>
<field>world</field>
</node>
</nodes>
XML;
注意对<nodes></nodes>
,<node></node>
,<field></field>
。您必须将每个已打开的标记与其已关闭的标记进行匹配。 See w3Schools for more about XML