`
flex_莫冲
  • 浏览: 1102633 次
  • 性别: 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文件内容
}
}
分享到:
评论

相关推荐

    用PHP与XML实现网站编程

    HTML虽然作为基础的网页描述语言,具有易于学习和普遍适用的特点,但在面对复杂的Web应用程序和跨平台数据交换时,其局限性逐渐显现。XML(可扩展标记语言)应运而生,弥补了HTML在数据结构化、扩展性和数据搜索等...

    xml存储留言方案php版-添加留言(源代码)

    这个XML存储留言的方案相对于数据库存储有其优势和局限性。优点包括:文件结构清晰,易于理解和维护;不需要额外的数据库管理。但缺点也很明显,如数据量大时性能较低,且不支持复杂查询。实际应用中,大型系统通常...

    XML(JSP,ASP,PHP)

    XML文档结构严谨,采用自描述性标签,允许用户自定义标签来表示数据。每个XML文档都由元素、属性、文本内容、注释和处理指令等组成。元素是XML文档的核心,它通过开始标签和结束标签包围内容,如`&lt;element&gt;content...

    PHP5 面向对象手册

    由于HTML的局限性,如结构与表现混杂,PHP与XML的结合为构建更灵活、结构化的Web应用提供了可能。 **8HTML的局限性分析** HTML主要用于描述网页的外观,但在表示复杂数据结构时显得力不从心,而XML则擅长处理数据...

    php-5.2.13.tar.gz

    五、版本的局限性 虽然PHP 5.2.13在当时是一个优秀的版本,但随着技术的不断发展,它已不再受官方支持,存在诸多安全漏洞和功能限制。因此,对于新项目,建议使用更新且安全的PHP版本,如7.x系列,以确保应用的安全...

    php解析xml 的四种简单方法(附实例)

    然而,Expat解析器也有其局限性。例如,它是一个无验证的解析器,忽略与文档相关联的DTD(文档类型定义)。如果XML文档格式不正确,解析过程可能以错误消息终止。此外,Expat解析器只支持US-ASCII、ISO-8859-1和UTF-...

    PHP cdata 处理(详细介绍)

    不过,使用状态机处理CDATA部分存在一些局限性,比如它不能很好地处理CDATA内部出现连续的三个或以上']'字符的情况。这会导致状态机无法正确处理结束标签,从而造成解析错误。因此,当遇到解析错误时,可能需要考虑...

    Web 2.0 编程思想:16条法则

    例如,RSS、OPML、XHTML、SimpleXML、JSON等都是广泛使用的数据交换格式。同时,像SOAP、XSD、RDF和ATOM这样的协议也为构建服务端API提供了基础。遵循这些标准有助于提高系统的兼容性和可维护性。 #### 法则十一:...

Global site tag (gtag.js) - Google Analytics