`
flex_莫冲
  • 浏览: 1095699 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

simpleXml的局限性

    博客分类:
  • php
 
阅读更多
simpleXML虽然很容易用。但是需要知道XML的结构,否则操作起来是很麻烦的,甚至无法达到目的,毕竟API就那么几个,很局限。而相对来说,DOM操作的API就很多,大多数操作都能胜任。
simpleXML存在的问题:
比如xml结构有两个title
<msg>
<titles>
<title>3344</title>
<title>3344</title>
</titles>
</msg>
通过以下代码可以访问到2个title节点的值。但是这必须知道xml的结构。而且要替换节点的值,xpath是做不到的。是复制而不是引用。
$xml = simplexml_load_file("test.xml");
//echo count($xml->author->children());
$s = "title";
$num = count($xml->msg->$s);
$titles =$xml->msg->$s;
//$xml->msg->children();
$xpath = & $xml->xpath("//title");
foreach ($xml->msg->title as $child)
  {
  var_dump($child);
  echo "Child node: " . $child;
  $child = "sss";
  }
$xml->asXML("test.xml");

如果通过遍历节点和属性来更改节点和属性的值,处理两个相同节点的时候,只能获取第一个节点的simplexmlElement对象,即使通过xpath拿到第二个也更改不了,因为是复制的。
例如:
1
$b = "title";
$node->$b[1] = "ccc";
2、
$node->$title[1] = "ccc";

$num = count($node-> $sub);


以上两个写法,第一个获取到的是空的simpleXMLELEMNT,它会新生成一个t的节点,内容是ccc。而第二个写法会找到第2个节点名称是title的节点并将它的内容改为ccc。
第一种完全偏离了我的想法。但没有其它办法达到第二种的效果。因此,我放弃了用simpleXML来解析XML。


-----------------------------

//遍历节点
function iterateNode($node) {
if (count($node->children()) == 0) {
echo "dfd";
} else {
foreach ($node->children() as $child) {
$sub = $child->getName(); //子节点名称
$child = replaceStr($child); //更改值
$subs = $node-> $sub;
if (count($subs) > 1) { //如果存在多个相同的子节点,则只会更改第一个节点的属性。因此要遍历更改
foreach ($subs as $i) {
iterateAttr($i); //更改属性
}
} else {
iterateAttr($node-> $sub); //更改属性
}
if (count($node->children()) == 0) {
@ $node-> $sub = replaceStr($sub); //会有warning提示。$node->$sub是数组类型。
} else {
$num = count($node-> $sub);
if ($num > 1) { //如果存在多个相同的子节点,则只会遍历第一个节点。
//$node->rectangle[1] 和 $node->$sub[1] 虽然$sub等于rectangle,但是这两者是不同的类型,
//第一个返回的是节点的值,而第二个返回的是一个空的simpleXML对象 SimpleXMLElement。
//可以通过xpath查询出节点的值,但是不能通过给xpath赋值改变节点的值。
for($i=0;$i<$num;$i++){
}

} else {
if(count($node->$sub->children()) == 0){
@ $node->$sub = replaceStr($node->$sub); //会有warning提示。$node->$sub是数组类型。
}else{
iterateNode($node-> $sub); //遍历子节点
}
}
}
}
}

}
//遍历属性 更改属性
function iterateAttr($node) {
foreach ($node->attributes() as $attr => $val) {
$newval = replaceStr($val);
$node["$attr"] = $newval; //更改XML文件内容
}
}
分享到:
评论

相关推荐

    SimpleXML,SimpleXML示例

    在这个示例中,我们将深入探讨SimpleXML的使用方法和核心特性,以及如何通过它来解析XML文档。 首先,让我们理解XML(eXtensible Markup Language)的基本概念。XML是一种标记语言,设计用来传输和存储数据,其结构...

    SimpleXML

    综上所述,SimpleXML是PHP处理XML数据的强大工具,它的易用性使得XML解析变得轻而易举。无论是简单的XML文档还是复杂的结构,SimpleXML都能提供简洁的解决方案。通过熟练掌握SimpleXML,开发者可以更高效地处理XML...

    delphi解析xml-simplexml

    为了处理XML文档,Delphi提供了一个名为SimpleXML的库,它是一个轻量级且易于使用的XML解析器。本篇文章将深入探讨如何在Delphi中使用SimpleXML来解析XML文件。 首先,我们需要了解XML的基本结构。XML文档由元素、...

    converter-simplexml-2.1.0

    "converter-simplexml-2.1.0.jar"则是Retrofit2的一个扩展,它集成了SimpleXML库,使得Retrofit2可以理解并处理XML格式的响应。通过添加这个转换器,开发者无需手动解析XML,而是可以直接将XML响应映射到自定义的...

    PHP 中的 SimpleXML 处理

    只要文档层次不深、不很复杂,而且没有混合内容,SimpleXML 要比使用 DOM 简单得多。如果事先知道文档结构该工具将更有用,虽然通过 XPath 可以满足这种要求。虽然不支持验证和混合内容有点不方便,但不是绝对的。很...

    GWT SimpleXML, XML解析

    总结来说,"GWT SimpleXML, XML解析"的主题涵盖了如何利用GWT的HTTP通信能力和SimpleXML库在客户端解析服务器返回的XML数据,这对于开发交互性强、数据驱动的Web应用具有重要的实际意义。理解并掌握这些技术,有助...

    SimpleXML解析XML

    SimpleXML是PHP中的一种轻量级的XML处理库,它为开发者提供了方便的方式来解析和操作XML文档。在PHP中,SimpleXML是...在处理如`parser_profile.xml`这样的文件时,SimpleXML的易用性使得数据提取和操作变得异常简单。

    Android开发-Retrofit-AndroidStudio(四)simplexml解析XML_免积分

    在本教程中,我们将深入探讨如何在Android Studio项目中使用Retrofit与simplexml库一起解析XML数据。简单XML库(Simple XML)是Java中一个轻量级、...在实际开发中,这种技术可以极大地提高代码的可读性和可维护性。

    Delphi关于SimpleXML 汉化修正版源代码.rar

    SimpleXML汉化修正版——D6-D2010,专用于解析 XML 文件的单元,这个不是官方原版,在使用过程中对发现的Bug进行过修正,已汉化成中文,如果觉得不可靠,请下载官方原版。  目前注意事项:  当保存XML 的时候,...

    SimpleXML代码

    通过阅读和理解SimpleXML的源代码,开发者可以更深入地了解XML处理的细节,提高代码的灵活性和可维护性。不过,由于这里只给出了"SimpleXML"这个文件名,没有具体的代码示例,要获取更多具体的信息,还需要查看实际...

    simplexml

    SimpleXML库(如PHP中的SimpleXMLElement类)提供了一种简洁的方式来处理XML数据,无需深入了解DOM的复杂性。 描述 "a simple xml dom parser" 暗示这是一个简化版的DOM解析器,它可能具有以下特点: 1. 易于使用:...

    PHP 5 SimpleXML 函数

    SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式,只要您知道 XML 文档的布局。 SimpleXML 转换 XML 文档到 SimpleXMLElement 对象。 通过正常的属性选择器和数组迭代器,这个对象能够像其他对象一样...

    PHP SimpleXML

    与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XML 元素中读取文本数据。 SimpleXML 可把 XML 文档(或 XML 字符串)转换为对象,比如: 元素被转换为 SimpleXMLElement 对象的单一属性。当同一...

    haoxoingdi_SimpleXML D6-D2010 改正版.rar

    标题 "haoxoingdi_SimpleXML D6-D2010 改正版.rar" 提供的信息表明,这是一个针对 Delphi 开发者的资源,包含了 SimpleXML 组件的修改版,适用于 Delphi 6 到 Delphi 2010 的版本。这个组件库可能为 Delphi 应用程序...

    php下使用SimpleXML处理XML文件.pdf

    SimpleXML库提供了一种简单易用的方式来解析和操作XML文档。下面我们将详细讨论如何使用SimpleXML来处理XML文件。 1. **SimpleXML简介** SimpleXML是PHP 5引入的一个轻量级库,用于处理XML数据。它通过将XML文档...

    PyPI 官网下载 | jk_simplexml-0.2019.9.11.tar.gz

    在分布式系统(如Zookeeper)和云原生环境中,"jk_simplexml"是处理XML配置文件的得力工具,能够帮助提高代码的可维护性和效率。无论是新手还是经验丰富的Python开发者,都应该了解并考虑在适当的情况下使用这个库,...

    haoxiongdi_SimpleXML for D6-D2007-D2009.rar

    标题 "haoxiongdi_SimpleXML for D6-D2007-D2009.rar" 提供的信息表明,这是一个与 Delphi 开发相关的压缩包,它包含了一个名为 "SimpleXML" 的组件或库,适用于 Delphi 的多个版本,从 Delphi 6 到 Delphi 2009。...

    php的SimpleXML方法读写XML接口文件实例解析

    首先,创建一个SimpleXML对象有三种方式: 1. 使用`new`关键字创建: ```php $xml = "&lt;personinfo&gt;&lt;item&gt;&lt;id&gt;1&lt;/id&gt;&lt;name&gt;aaa&lt;/name&gt;&lt;age&gt;16&lt;/age&gt;&lt;/item&gt;&lt;item&gt;&lt;id&gt;2&lt;/id&gt;&lt;name&gt;bbb&lt;/name&gt;&lt;age&gt;26&lt;/age&gt;&lt;/item&gt;...

    PHP simplexml_import_dom()函数讲解

    1. **易用性**:SimpleXML提供了更直观的方式来访问和操作XML数据,例如,通过属性和方法直接访问XML元素和属性。 2. **效率**:虽然DOM可以处理复杂的XML操作,但对于简单的读取和写入任务,SimpleXML通常更快。 3....

    SimpleXML2-开源

    SimpleXML2 是一个用于读取 XML 文件和编写 XML 文件的库。 它是用 C++ 编写的,要使用它,您只需在项目中包含一个源文件和一个头文件,然后它就可以工作了。

Global site tag (gtag.js) - Google Analytics