SimpleXMLElement::__construct()
method及相关功能simplexml_load_string()
和 simplexml_load_file()
都有一对与 XML 命名空间相关的可选参数:$ns
和 $is_prefix
。
尽管我可以看到它们与 XML namespace 相关,但我想知道它们的用途和工作原理。
最佳答案
根据 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。现在将指定迭代的参数设置为在与默认 namespace 不同的 XML 命名空间上更改:
$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)
关于php - "$ns"和 "$is_prefix"参数是关于什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258883/