我正在尝试解析下面的XML,以便最终得到一个类似于包含示例的数组...我很难弄清楚如何获取标记内的属性以输出我希望它的方式...
XML
<cust rid="999999" memberid="12345" lname="Doe" fname="John">
<address memberid="12345" address1="1234 Mockingbird Lane" address2="" city="Oakland" state="CA" zip="91111" country="United States"/>
<phone memberid="12345" phonenumber="415.555.1212" countrycodeid="1" phonetype="Mobile"/>
<custcode memberid="12345" ccode="Silver" deleted=”1”/>
<custcode memberid="12345" ccode="Gold"/>
</cust>
我想要的数组::注意添加的数组元素
Array
[cust] => Array
[rid] => 999999
[member_id] => 12345
[lname] => Doe
[fname] => John
[address] => Array
[0] => Array
[memberid] => 12345
[address1] => 1234 Mockingbird Lane
[address2] =>
[city] => Oakland
[state] => CA
[zip] => 91111
[country] => United States
[phone] => Array
[0] => Array
[memberid] => 12345
[phonenumber] => 415.555.1212
[countrycodeid] => 1
[phonetype] => Mobile
[custcode] => Array
[0] => Array
[memberid] => 12345
[ccode] => Silver
[deleted] => 1
[1] => Array
[memberid] => 12345
[ccode] => Gold
答案 0 :(得分:3)
您可以使用DOMDocument及其字段/方法来提取数据。
DOMDocument也是DOMNode有一个名为attributes的字段,它是属性名称的映射和值的节点,因此您可以从中获取属性名称和值(#6-9)。 每个节点都有firstChild和next兄弟,你可以浏览所有子节点(#12-26)。
由此可以相应地创建数据数组。这是我使用的代码(稍作调整)。
/*01*/ function Parse($XMLNode, $XMLData = null) {
/*02*/ if ($XMLData == null)
/*03*/ $XMLData = array();
/*04*/
/*05*/ // Extract attribute as the array values
/*06*/ if ($XMLNode->hasAttributes()) {
/*07*/ foreach ($XMLNode->attributes as $AttrName => $AttrNode)
/*08*/ $XMLData[$AttrName] = $AttrNode->nodeValue;
/*09*/ }
/*10*/
/*11*/ // Loop all child
/*12*/ $Child = $XMLNode->firstChild;
/*13*/ while ($Child != null) {
/*14*/ $Name = $Child->nodeName;
/*15*/ if ($Name != "#text") { // Ignore the text
/*16*/ $Nodes = $XMLData[$Name];
/*17*/ if ($Nodes == null)
/*18*/ $Nodes = array(); // Array value from subnode is a nest array
/*19*/
/*21*/ $Nodes[] = Parse($Child);
/*22*/ $XMLData[$Name] = $Nodes;
/*23*/ }
/*24*/
/*25*/ $Child = $Child->nextSibling;
/*26*/ }
/*27*/ return $XMLData;
/*28*/ }
/*29*/
/*31*/ $XML = <<<EOF
/*32*/ <cust rid="999999" memberid="12345" lname="Doe" fname="John">
/*33*/ <address memberid="12345" address1="1234 Mockingbird Lane" address2="" city="Oakland" state="CA" zip="91111" country="United States" />
/*34*/ <phone memberid="12345" phonenumber="415.555.1212" countrycodeid="1" phonetype="Mobile" />
/*35*/ <custcode memberid="12345" ccode="Silver" deleted="1" />
/*36*/ <custcode memberid="12345" ccode="Gold" />
/*37*/ </cust>
/*38*/ EOF;
/*39*/
/*41*/ $DOC = new DOMDocument();
/*42*/ $DOC->loadXML($XML);
/*43*/ $Data = Parse($DOC->firstChild);
/*44*/
/*45*/ print_r($Data);
上面的代码按预期返回结果。
希望这有帮助。
答案 1 :(得分:1)
您应该尝试使用DOM。评论中有几个dom2array函数,如果它们不适合你,它们可以为你提供更多的想法。
答案 2 :(得分:1)
答案 3 :(得分:0)
NawaMan的答案可能就是你所需要的,但是如果你想简化你的PHP DOM代码,你也可以考虑受jQuery启发的phpQuery。