5

SimpleXMLElement::__construct()方法simplexml_load_string()和相关函数simplexml_load_file()都具有一对与 XML Namepspaces 相关的可选参数:$ns$is_prefix.

尽管我可以看到这些与 XML 名称空间有关,但我想知道它们的用途和工作原理。

4

1 回答 1

6

根据 PHP 手册,这两个参数已在 PHP 5.2 版中添加。官方 PHP 5 更新日志没有明确记录这些更改,但PHP 5.2 更新自述文件有这些

然后查看构造函数的 5.2 源代码(在 lxr 中),它表明这与迭代器有关:

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 命名空间会改变这一点:

$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)
于 2013-06-23T08:18:28.597 回答