你可以用php来解析xml文档,把数据组织成想要的结构,例子在手册上有,
用xml_parse_into_struct比较好使。

解决方案 »

  1.   

    xml_parse_into_struct是一个很奇怪的函数
      

  2.   

    嗯,xml_parse_into_struct,好用。/***
    自己用的仅供参考 初始化变量:$filename 是xml的文件名
                $root     是xml的根节点
                $idNode   是具有子节点的节点的名称
        调用方法:$aa = new ParseXml("aa.xml",'Root',array('Path'));
                  $parser->parse();
               $parser->parseIntoData();
                  $data = $parser->getData();
                  print_R($data);
         然后可以根据数组的结构,取自己要的值。
        备注 :  1、数组的结构和xml文件的结构是一样的。
          2、块有属性时,属性名称是"id"的情况同正常情况有些不同,是根据自己需要作的,可以自己试试看。
                 3、基本可以满足简单的要求。
                 4、xml解析不是很快的,因此可以把这个得到的数组序列化,存起来,第二次调用时,就不用解析了,可以直接调用序列化的数组。xml测试文件如下:"aa.xml"
    <Root id="root">
    <value1>1</value1>
        <value2>2</value2>
        <value3>3</value3>
        <name>name</name>
        <SecondRoot id="9">
    <ThirdRoot id="姓名1">
    <id>1</id>
    <name>姓名</name>
    </ThirdRoot>
    <ThirdRoot id="2">
    <id>2</id>
    <name>name</name>
    </ThirdRoot>
            <value1>1</value1>
        </SecondRoot>
        <SecondRoot id="2">
            <ThirdRoot id="1">
    <id>1</id>
    <name>name</name>
    </ThirdRoot>
    <ThirdRoot id="2">
    <id>2</id>
    <name>name</name>
    </ThirdRoot>
            <value1>1</value1>
        </SecondRoot>
        <Faq>
         <Question>
             <content>content</content>
                <answer>answer</answer>
            </Question>
            <Question>
             <content>content</content>
                <answer>answer</answer>
            </Question>
        </Faq>
    </Root>***/class ParseXml extends StructObject{    var $fileName = "";
        var $root = "";
        var $idNode = array();    var $indexs = array();
        var $values = array();
        var $data = array();    var $parsed = False;
        var $parsedIntoData = False; function ParseXml($fileName, $root, $idNode=array()){
         parent::StructObject();
            $this->fileName = $fileName;
            $this->root = $root;
            $this->idNode = $idNode;
        }    function parse(){
            $xmlString = CoreUtil::readFile($this->fileName);
            $parser = xml_parser_create();
            xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
        xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
        if(!xml_parse_into_struct($parser, $xmlString, $this->values, $this->indexs))
                return $this->haltError(sprintf("class ParseXml error: file(%s) %s at line %d", $this->fileName, xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser)));
        xml_parser_free($parser);
            $this->parsed = True;
        }    function parseIntoData(){
            $this->data = &$this->getNodeData($this->root);
            $this->parsedIntoData = True;
        }    function &getNodeData($root, $nodeIndex="id"){
         if(!isset($this->indexs[$root]))
                return $this->haltError(sprintf("class ParseXml error: file(%s):node(%s) is not exists", $this->fileName, $root));
            $nodeStart = $this->indexs[$root][0];
            $nodeEnd = $this->indexs[$root][sizeof($this->indexs[$root])-1];
            return  $this->_getNodeData($root, "id", $nodeStart, $nodeEnd);
        }    function &_getNodeData($nodeTag, $nodeIndex=NULL, $nodeStart, $nodeEnd){
            $level = 0;
            $nodeStrLen = array("0"=>0);
            $nodeStr = "\$result";
            $autoIndex = array("0"=>0);
            $result = array();
            $values = &$this->values;
            for($i=$nodeStart; $i<=$nodeEnd ; $i++){
                switch($values[$i]['type']){
                    case "complete":
                            $tmp = $nodeStr."['".$values[$i]['tag']."']='".$values[$i]['value']."';";
                            eval($tmp);
                          break;
                    case "open":
                            $level++;
                            $nodeStr .= "['".$values[$i]['tag']."']";
                            $index = isset($values[$i]['attributes'][$nodeIndex])? $values[$i]['attributes'][$nodeIndex]: "";
                            if(in_array($values[$i]['tag'], $this->idNode)){
                             if($index=="") {
                                    $autoIndex[$level] = isset($autoIndex[$level])? ++$autoIndex[$level]: 0;
                                    $index = '__'.$autoIndex[$level].'__';
                                }
                                $nodeStr .= "['".$index."']";
                            }
                            $nodeStrLen[$level] = strlen($nodeStr);
                            if(isset($values[$i]['attributes'])){
                             $tmp = $nodeStr."['attributes']=\$values[$i]['attributes'];";
                             eval($tmp);
                            }
                          break;
                    case "close":
                            $level--;
                         $nodeStr = substr($nodeStr, 0, $nodeStrLen[$level]);
                }
            }
            return $result[$nodeTag];
        }    function &getIndexs(){
            return $this->indexs;
        }    function &getValues(){
            return $this->values;
        }    function &getData(){
         if(!$this->parsedIntoData)  $this->parseIntoData();
         return $this->data;
        }    function _ParseXml(){
            unset($this->indexs);
            unset($this->vlaues);
            unset($this->data);
            parent::_StructObject();
        }}
    ?>