【问题标题】:PHP - How to parse this xml?PHP - 如何解析这个 xml?
【发布时间】:2009-10-17 16:27:02
【问题描述】:

我正在尝试解析下面的 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

【问题讨论】:

    标签: php xml parsing


    【解决方案1】:

    您可以使用 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);
    

    以上代码如你所愿返回结果。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您应该尝试使用DOM。 cmets 中有几个 dom2array 函数,如果它们不适合您,它们可以为您提供进一步的想法。

      【讨论】:

        【解决方案3】:

        如果您使用的是 PHP 5,请使用 SimpleXML。它比 DOM 更干净、更容易使用和更快。如果您使用 PHP 4,则必须使用 DomXML 而不是 Dom

        【讨论】:

          【解决方案4】:

          NawaMan 的答案可能正是你所需要的,但如果你想总体上简化你的 PHP DOM 代码,你也可以考虑受 jQuery 启发的phpQuery

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-06
            • 2011-01-23
            • 2012-08-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-01
            相关资源
            最近更新 更多