php解析xml

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

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

思路:

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

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

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

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

下面是示例代码:

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脚本便达到目的了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Felix的技术分享

理解对C++裸指针释放后重用的问题

25590
来自专栏维C果糖

史上最简单的 MySQL 教程(十二)「记录长度」

MySQL 中规定:任何一条记录最长不超过 65535 个字节,这意味着varchar永远达不到理论最大值。

38470
来自专栏码农笔录

Failed to resolve directive: el vue2报错

17720
来自专栏专注 Java 基础分享

表示一个文件的 File 类型

从本篇文章开始,我们将开启对 Java IO 系统的学习,本质上就是对文件的读写操作,听上去简单,其实并不容易。Java 的 IO 系统一直在完善和改进,设计了...

10600
来自专栏肖洒的博客

【更正】Java调用Python

该方法可以解决传递形参的问题。也可以执行Python程序。 遇到的问题:需要确定好jython的路径问题和其他设置的路径问题。

13430
来自专栏YG小书屋

Python3编码与mysql编码介绍

38450
来自专栏Petrichor的专栏

tensorflow: 对variable_scope进行reuse的两种方法

在tensorflow中,为了 节约变量存储空间 ,我们常常需要通过共享 变量作用域(variable_scope) 来实现 共享变量 。

3.3K60
来自专栏Janti

JVM活学活用——类加载机制

类的实例化过程 ---- 有父类的情况 1. 加载父类静态     1.1 为静态属性分配存储空间并赋初始值     1.2 执行静态初始化块和静态初始化...

41680
来自专栏企鹅号快讯

再见乱码:5 分钟读懂 MySQL 字符集设置

作者: 程序猿小卡_casper 原文:https://segmentfault.com/a/1190000012775484 一、内容概述 在MySQL的使用...

22480
来自专栏技术专栏

慕课网高并发实战(五)- 安全发布对象

不正确的发布可变对象导致的两种错误: 1.发布线程意外的所有线程都可以看到被发布对象的过期的值 2.线程看到的被发布对象的引用是最新的,然而被发布对象的状态...

13820

扫码关注云+社区

领取腾讯云代金券