代码之家  ›  专栏  ›  技术社区  ›  MB34

xpath解析成数组

php
  •  0
  • MB34  · 技术社区  · 7 年前
    $xml = simplexml_load_file('Request.xml');
    $xml->registerXPathNamespace("ess", "localhost/ESS");
    $partnums = array();
    
    $xp = "descendant::ess:ProPartList/ess:ProPart/ess:SelectedPart";
    $selected = $xml->xpath($xp);        
    $x = 0;
    foreach($selected as $part) {
        $partnuminfo = $part->xpath("//ess:PartNumInfo");
        foreach($partnuminfo as $p) {
            echo $p->asXML();
            $_Type = (string)$part->children("ess",true)->PartNumType;
            $partnums[$x] = array($_Type => (string)$part->children("ess",true)->PartNum);
            $x++;
        }
    }
    print_r($partnums);
    

    使用上面的代码,我似乎无法理解如何解析下面的XML:

    <ess:ProInfo>
        <ess:ProPartList>
            <ess:ProPart>
                <ess:SelectedPart>
                    <ess:PartNumInfo>
                        <ess:PartNumType>OE</ess:PartNumType>
                        <ess:PartNum>04715SNAA90ZZ</ess:PartNum>
                    </ess:PartNumInfo>
                    <ess:PartNumInfo>
                        <ess:PartNumType>IC</ess:PartNumType>
                        <ess:PartNum>536-01037</ess:PartNum>
                    </ess:PartNumInfo>
                    <ess:PartNumInfo>
                        <ess:PartNumType>PType</ess:PartNumType>
                        <ess:PartNum>536</ess:PartNum>
                    </ess:PartNumInfo>
                </ess:SelectedPart>
            </ess:ProPart>
            <ess:ProPart>
                <ess:SelectedPart>
                    <ess:PartNumInfo>
                        <ess:PartNumType>OE</ess:PartNumType>
                        <ess:PartNum>71570SNAA00</ess:PartNum>
                    </ess:PartNumInfo>
                    <ess:PartNumInfo>
                        <ess:PartNumType>IC</ess:PartNumType>
                        <ess:PartNum>536-01036</ess:PartNum>
                    </ess:PartNumInfo>
                </ess:SelectedPart>
            </ess:ProPart>
            <ess:ProPart>
                <ess:SelectedPart>
                    <ess:PartNumInfo>
                        <ess:PartNumType>OE</ess:PartNumType>
                        <ess:PartNum>66100SNEA00ZZ</ess:PartNum>
                    </ess:PartNumInfo>
                    <ess:PartNumInfo>
                        <ess:PartNumType>IC</ess:PartNumType>
                        <ess:PartNum>117-50338</ess:PartNum>
                    </ess:PartNumInfo>                                
                </ess:SelectedPart>
            </ess:ProPart>
            <ess:ProPart>
                <ess:SelectedPart>
                    <ess:PartNumInfo>
                        <ess:PartNumType>OE</ess:PartNumType>
                        <ess:PartNum>04655SNE305ZZ</ess:PartNum>
                    </ess:PartNumInfo>
                </ess:SelectedPart>
            </ess:ProPart>
        </ess:ProPartList>
    </ess:ProInfo>
    

    创建这个数组()

    array(
        0 => array("OE" => "04715SNAA90ZZ", "IC" => "536-01037", "PType" => "536"),
        1 => array("OE" => "71570SNAA00",   "IC" => "536-01036"),
        2 => array("OE" => "66100SNEA00ZZ", "IC" => "117-50338"),
        3 => array("OE" => "04655SNE305ZZ")
    )
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Nigel Ren    7 年前

    我认为主要的问题是 //ess:PartNumInfo 在第二个xpath表达式中,这也会导致找到其他元素(///表示任何元素)。如果你把它改成 descendant:: axis和第一个xpath表达式一样,它将只查找起点内的元素。

    我已经更改了代码,以便在下一级对元素进行分组,所以…

    $xp = "descendant::ess:ProPartList/ess:ProPart/ess:SelectedPart";
    $selected = $xml->xpath($xp);
    foreach($selected as $part) {
        $partnuminfo = $part->xpath("descendant::ess:PartNumInfo");
        $group = array();
        foreach($partnuminfo as $p) {
            $_Type = (string)$p->children("ess",true)->PartNumType;
            $group[$_Type] =(string)$p->children("ess",true)->PartNum;
        }
        $partnums[] = $group;
    }
    print_r($partnums);
    

    给予。。。

    Array
    (
        [0] => Array
            (
                [OE] => 04715SNAA90ZZ
                [IC] => 536-01037
                [PType] => 536
            )
    
        [1] => Array
            (
                [OE] => 71570SNAA00
                [IC] => 536-01036
            )
    
        [2] => Array
            (
                [OE] => 66100SNEA00ZZ
                [IC] => 117-50338
            )
    
        [3] => Array
            (
                [OE] => 04655SNE305ZZ
            )
    
    )
    
    推荐文章