PHP+XML用什么数据结构好? 你可以用php来解析xml文档,把数据组织成想要的结构,例子在手册上有,用xml_parse_into_struct比较好使。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 xml_parse_into_struct是一个很奇怪的函数 嗯,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(); }}?> 创建新图像的问题 不能写入数据库? 学习php问题 请教一下,如何设计标签体系[整站] 求该结果的preg_replace的替换写法 刚开发完成一个MySQL数据库动态创建系统,比phpMyAdmin要灵活方便多了,如果想要,跟我联系吧 防止刷新重复提交的两种方法 一个很菜的问题,imap_open出错,谢谢! 在IIS上安装php的问题 两个设置分页的都出问题,想屎了... 哪里有好用的图片管理网站代码?大家推荐一下!! 这一类:_FILES[] 变量的详细资料在那里可以找到?
自己用的仅供参考 初始化变量:$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();
}}
?>