使用PHP将嵌套的xml解析为对象
发布时间:2020-12-13 17:02:09 所属栏目:PHP教程 来源:网络整理
导读:我必须用 PHP将xml文件解析为一个对象.目前我不知道如何做到这一点,感谢帮助. xml非常大.我必须解析它的一部分,如下所示: someNamespace:xmlDocumentsomeNamespace:categories category name="Patrick" anAttribute="numericValue" anotherAttribute="numer
我必须用
PHP将xml文件解析为一个对象.目前我不知道如何做到这一点,感谢帮助.
xml非常大.我必须解析它的一部分,如下所示: <someNamespace:xmlDocument> <someNamespace:categories> <category name="Patrick" anAttribute="numericValue" anotherAttribute="numericValue"> <category name="Andrew" anAttribute="numericValue" anotherAttribute="numericValue"> <category name="Alice" anAttribute="numericValue" anotherAttribute="numericValue"> <category name="Thomas" anAttribute="numericValue" anotherAttribute="numericValue"> <category name="Michael" anAttribute="numericValue" anotherAttribute="numericValue"/> <category name="Matthew" anAttribute="numericValue" anotherAttribute="numericValue"/> </category> <category name="Janet" anAttribute="numericValue" anotherAttribute="numericValue"> <category name="Steven" anAttribute="numericValue" anotherAttribute="numericValue"/> <category name="Christopher" anAttribute="numericValue" anotherAttribute="numericValue"/> </category> <category name="Sue" anAttribute="numericValue" anotherAttribute="numericValue"/> </category> <category name="Charles" anAttribute="numericValue" anotherAttribute="numericValue"> <category name="John" anAttribute="numericValue" anotherAttribute="numericValue"> <category name="Charles" anAttribute="numericValue" anotherAttribute="numericValue"/> <category name="Rosamund" anAttribute="numericValue" anotherAttribute="numericValue"/> <category name="Stuart" anAttribute="numericValue" anotherAttribute="numericValue"/> <category name="Rosamund" anAttribute="numericValue" anotherAttribute="numericValue"/> </category> <category name="John" anAttribute="numericValue" anotherAttribute="numericValue"/> </category> </category> <category name="Oliver" anAttribute="numericValue" anotherAttribute="numericValue"> <category name="Jane" anAttribute="numericValue" anotherAttribute="numericValue"/> <category name="Lucy" anAttribute="numericValue" anotherAttribute="numericValue"> <category name="David" anAttribute="numericValue" anotherAttribute="numericValue"/> <category name="Robert" anAttribute="numericValue" anotherAttribute="numericValue"/> <category name="Hetty" anAttribute="numericValue" anotherAttribute="numericValue"> <category name="Kenneth" anAttribute="numericValue" anotherAttribute="numericValue"/> <category name="Jonathan" anAttribute="numericValue" anotherAttribute="numericValue"/> </category> <category name="Freddy" anAttribute="numericValue" anotherAttribute="numericValue"/> <category name="Virginia" anAttribute="numericValue" anotherAttribute="numericValue"/> </category> </category> </category> </someNamespace:categories> 每个“name”和“anAttribute”属性都是唯一的. 之后我想要的是一个带有许多类别对象的类别对象…… 谢谢! 解决方法
定义DOMDocument的扩展
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; } } 像这样使用 $mydom = new MyDOMDocument(); $mydom->load('test.xml'); print_r($mydom->toArray()); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |