SimpleXMLElement::__construct()
method以及相关函数simplexml_load_string()
和simplexml_load_file()
都有一对可选的与XML Namepspaces相关的参数:$ns
和$is_prefix
。
尽管我可以看到那些与XML名称空间相关的内容,但我想知道它们的用途以及它们的工作原理。
答案 0 :(得分:6)
根据PHP手册,PHP版本5.2中添加了这两个参数。官方PHP 5更改日志没有明确指出这些更改,而是the PHP 5.2 update readme has these。
然后查看构造函数(in lxr)的5.2源代码,它表明这与迭代器有关:
sxe->iter.nsprefix = ns_len ? xmlStrdup((xmlChar *)ns) : NULL; sxe->iter.isprefix = isprefix;
所以我假设这两个指定了 SimpleXMLElement
默认情况下迭代的XML命名空间。一点点测试可以验证这一点:
$xml = new SimpleXMLElement(
'<root><a/><b/><c/></root>'
);
var_dump(count(iterator_to_array($xml))); #int(3)
默认情况下,迭代器在这里有三个元素:a,b和c。现在将指定迭代的参数设置为不同于默认值的XML-Namespace,将其更改为:
$xml = new SimpleXMLElement(
'<root><a/><b/><c/></root>', 0, FALSE, "ns:1"
);
var_dump(count(iterator_to_array($xml))); #int(0)
迭代现在没有元素,因为根元素在URI ns:1
的名称空间中没有任何子元素。
将根元素的名称空间更改为ns:1
将再次显示三个元素,因为现在这三个子元素位于该名称空间中,它们从父元素继承它:
$xml = new SimpleXMLElement(
'<root xmlns="ns:1"><a/><b/><c/></root>', 0, FALSE, "ns:1"
);
var_dump(count(iterator_to_array($xml))); #int(3)
同样,子节点本身位于该参数对指定的命名空间中,并且通过这些元素上的前缀:
$xml = new SimpleXMLElement(
'<root xmlns:n="ns:1"><n:a/><n:b/><n:c/></root>', 0, FALSE, "ns:1"
);
var_dump(count(iterator_to_array($xml))); #int(3)