php解析xml

php解析xml有很多种办法,文档中有,搜索一下就一大把的。

今天遇到一个需求:将某个xml中的节点属性提取出来,然后更新数据库某一表中的字段。

思路:

解析XML,获取所有的节点属性 –> 循环节点集合,获取对应的属性 –> 拼接sql字符串存入一数组 –> 将数组转为字符串保存于某一文件中

这里使用了xpath,在写代码的过程中遇到两个问题:

1、xml的史路径属性为D:\xx\…时load不了文件,改为”/”(linux下的分隔符)就可以了

2、获取一个节点的属性,使用::attributes,编辑器就不停的红色提示,找到半天文档,最后用->getAttribute()就行了(猜的,因为太奇怪了,它支持->previousSibling和->nodeValue),按照,文档上的DOMElement::getAttribute直接就报错了..

image

下面是示例代码:

   1: <title>xml 转换为 sql</title>
   2: <meta http-equiv='content-type' content='text/html; charset=utf-8' />
   3: <style type="text/css">
   4:     .tip_info {margin-bottom:10px;}
   5:     .tip_info span {color:#f00;}
   6: </style>
   7: <?php
   8: $xml = "D:/res/dressConfig.xml";
   9: $doc = new DOMDocument();
  10: $doc->load($xml);
  11: $xpath = new DOMXPath($doc);
  12: $query = "//i";
  13: $entries = $xpath->query($query);
  14: $len = $entries->length;
  15:  
  16: echo "<div class='tip_info'>总共找到:<span>".$len."</span>个节点</div>";
  17:  
  18: $arr = array();
  19:  
  20: $idx = 0;
  21: while ($idx < $len) {
  22:     $nodeItem = $entries->item($idx);
  23:     $id = $nodeItem->getAttribute("i");
  24:     $name = $nodeItem->getAttribute("n");
  25:     $inf = $nodeItem->getAttribute("inf");
  26:     
  27: //    echo "<div>".$id.'--'.$name.'--'.$inf."</div>";
  28:     $idx++;
  29:     
  30:     array_push($arr, "update dress_item t SET t.s_name='".$name."',t.s_intro='".$inf."' WHERE t.n_doid=".$id.";");
  31: }
  32:  
  33: $dir = "d:/sql/";
  34:  
  35: if (!is_dir($dir)) {
  36:     mkdir($dir);
  37: }
  38:  
  39: file_put_contents("d:/sql/dress_item.sql", implode("\n\r", $arr));
  40: echo "生成完毕!";
  41: ?>

因为数据是从数据库表中生成出来的,所以找到的节点数即为表中的记录总数。生成后可以大概看一下内容是否正确,然后再执行该sql脚本便达到目的了。

原文地址:https://www.cnblogs.com/meteoric_cry/p/2007628.html