PHP需要获取XML解析阿里巴巴的产品分类信息的XML,但是这个XML文件是这样的格式的,全部都是category 的标签。而simple html dom 这个类和 DOMDOCUMENT 这两个都是只有getElementsByTagName() 这个方法来获取,而不能层层获取。XML文件内容格式如下六层category,需要使用PHP读取后存入数据库表 @#__cat 中。<?xml version="1.0" encoding="GBK"?>
<root>
<category superId="0">
<category id="58" leaf="false" name="照明工业">
<category superId="58">
<category id="10219" leaf="false" name="白炽灯">
<category superId="10219">
<category id="1032285" leaf="true" name="彩色灯泡"/>
<category id="1032279" leaf="true" name="卤钨灯泡"/>
<category id="1032283" leaf="true" name="摄影灯泡"/>
<category id="1035280" leaf="true" name="普通照明白炽灯"/>
<category id="1035279" leaf="true" name="微型灯泡"/>
<category id="1035278" leaf="true" name="聚光灯泡"/>
<category id="1035277" leaf="true" name="水下灯泡"/>
<category id="1035276" leaf="true" name="无影灯"/>
<category id="1035275" leaf="true" name="红外线灯泡"/>
<category id="1035274" leaf="true" name="指示灯泡"/>
<category id="1035273" leaf="true" name="其他白炽灯"/>
</category>
</category>
<category id="527" leaf="false" name="气体放电灯">
<category superId="527">
<category id="10222" leaf="true" name="氙气灯"/>
<category id="10224" leaf="true" name="U型荧光灯管"/>
<category id="1032286" leaf="true" name="冷阴极荧光灯"/>
<category id="1032282" leaf="true" name="霓虹灯管"/>
<category id="1032281" leaf="true" name="直型荧光灯管"/>
<category id="1032280" leaf="true" name="环型荧光灯管"/>
<category id="1032277" leaf="true" name="钠灯"/>
<category id="1032276" leaf="true" name="汞灯"/>
<category id="1032275" leaf="true" name="金卤灯"/>
<category id="1032274" leaf="true" name="氖灯"/>
<category id="1032273" leaf="true" name="紫外线灯管"/>
<category id="1032269" leaf="true" name="螺旋型荧光灯管"/>
<category id="1032266" leaf="true" name="其他气体放电灯"/>
</category>
</category>
</category>
</category>
</category>
</root>

解决方案 »

  1.   

    <?php$xml = <<<EOF
    <?xml version="1.0" encoding="GBK"?>
    <root>
    <category superId="0">
        <category id="58" leaf="false" name="照明工业">
            <category superId="58">
                <category id="10219" leaf="false" name="白炽灯">
                    <category superId="10219">
                        <category id="1032285" leaf="true" name="彩色灯泡"/>
                        <category id="1032279" leaf="true" name="卤钨灯泡"/>
                        <category id="1032283" leaf="true" name="摄影灯泡"/>
                        <category id="1035280" leaf="true" name="普通照明白炽灯"/>
                        <category id="1035279" leaf="true" name="微型灯泡"/>
                        <category id="1035278" leaf="true" name="聚光灯泡"/>
                        <category id="1035277" leaf="true" name="水下灯泡"/>
                        <category id="1035276" leaf="true" name="无影灯"/>
                        <category id="1035275" leaf="true" name="红外线灯泡"/>
                        <category id="1035274" leaf="true" name="指示灯泡"/>
                        <category id="1035273" leaf="true" name="其他白炽灯"/>
                    </category>
                </category>
                <category id="527" leaf="false" name="气体放电灯">
                    <category superId="527">
                        <category id="10222" leaf="true" name="氙气灯"/>
                        <category id="10224" leaf="true" name="U型荧光灯管"/>
                        <category id="1032286" leaf="true" name="冷阴极荧光灯"/>
                        <category id="1032282" leaf="true" name="霓虹灯管"/>
                        <category id="1032281" leaf="true" name="直型荧光灯管"/>
                        <category id="1032280" leaf="true" name="环型荧光灯管"/>
                        <category id="1032277" leaf="true" name="钠灯"/>
                        <category id="1032276" leaf="true" name="汞灯"/>
                        <category id="1032275" leaf="true" name="金卤灯"/>
                        <category id="1032274" leaf="true" name="氖灯"/>
                        <category id="1032273" leaf="true" name="紫外线灯管"/>
                        <category id="1032269" leaf="true" name="螺旋型荧光灯管"/>
                        <category id="1032266" leaf="true" name="其他气体放电灯"/>
                    </category>
                </category>
            </category>
        </category>
    </category>
    </root>
    EOF;$dom = new DOMDocument('1.0', 'GBK');
    $dom->loadXML($xml);$ret = array();$xpath = new DOMXPath($dom);// 第一级
    $query = '//root/category[@superId="0"]/category';$ret = getSub($query);var_dump($ret);function getContent($entry) {
    $ret = array(
    'id' => $entry->getAttribute('id'),
    'leaf' => $entry->getAttribute('leaf'),
    'name' => $entry->getAttribute('name'),
    );
    return $ret;
    }function getSub($query) {
    global $xpath; $ret = array();
    $entries = $xpath->query($query); foreach($entries as $entry) { if($entry->hasAttribute('id')) {

    $id = $entry->getAttribute('id');

    $ret[$id] = getContent($entry); // 获取子项
    $ret[$id]['sub'] = getSub($query . '/category[@superId="'.$id.'"]/category');
    }
    }

    return $ret;
    }
      

  2.   

    获取子项那里其实可以做一个判断,不过最多避免一次空查询,影响不是很大!
    if(!$ret[$id]['leaf']) {
    // 获取子项
    $ret[$id]['sub'] = getSub($query . '/category[@superId="'.$id.'"]/category');
    }