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文件内容
}
}
分享到:
相关推荐
HTML虽然作为基础的网页描述语言,具有易于学习和普遍适用的特点,但在面对复杂的Web应用程序和跨平台数据交换时,其局限性逐渐显现。XML(可扩展标记语言)应运而生,弥补了HTML在数据结构化、扩展性和数据搜索等...
这个XML存储留言的方案相对于数据库存储有其优势和局限性。优点包括:文件结构清晰,易于理解和维护;不需要额外的数据库管理。但缺点也很明显,如数据量大时性能较低,且不支持复杂查询。实际应用中,大型系统通常...
XML文档结构严谨,采用自描述性标签,允许用户自定义标签来表示数据。每个XML文档都由元素、属性、文本内容、注释和处理指令等组成。元素是XML文档的核心,它通过开始标签和结束标签包围内容,如`<element>content...
由于HTML的局限性,如结构与表现混杂,PHP与XML的结合为构建更灵活、结构化的Web应用提供了可能。 **8HTML的局限性分析** HTML主要用于描述网页的外观,但在表示复杂数据结构时显得力不从心,而XML则擅长处理数据...
五、版本的局限性 虽然PHP 5.2.13在当时是一个优秀的版本,但随着技术的不断发展,它已不再受官方支持,存在诸多安全漏洞和功能限制。因此,对于新项目,建议使用更新且安全的PHP版本,如7.x系列,以确保应用的安全...
然而,Expat解析器也有其局限性。例如,它是一个无验证的解析器,忽略与文档相关联的DTD(文档类型定义)。如果XML文档格式不正确,解析过程可能以错误消息终止。此外,Expat解析器只支持US-ASCII、ISO-8859-1和UTF-...
不过,使用状态机处理CDATA部分存在一些局限性,比如它不能很好地处理CDATA内部出现连续的三个或以上']'字符的情况。这会导致状态机无法正确处理结束标签,从而造成解析错误。因此,当遇到解析错误时,可能需要考虑...
例如,RSS、OPML、XHTML、SimpleXML、JSON等都是广泛使用的数据交换格式。同时,像SOAP、XSD、RDF和ATOM这样的协议也为构建服务端API提供了基础。遵循这些标准有助于提高系统的兼容性和可维护性。 #### 法则十一:...