什么是“$ ns”和“$ is_prefix”参数?

时间:2013-06-23 08:18:29

标签: php simplexml xml-namespaces

SimpleXMLElement::__construct() method以及相关函数simplexml_load_string()simplexml_load_file()都有一对可选的与XML Namepspaces相关的参数:$ns$is_prefix

尽管我可以看到那些与XML名称空间相关的内容,但我想知道它们的用途以及它们的工作原理。

1 个答案:

答案 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)