php - "$ns"和 "$is_prefix"参数是关于什么的?

标签 php simplexml xml-namespaces

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/

相关文章:

php - 页 View 表: I only want one row per ip per page,但只能有一个主键。我该如何解决这个问题?

PHP 简单 XML 删除所有子项

java - Spring 和 CastorMarshaller : add namespace to XML root

c# - 如何在 C# 中设置命名空间 URI?

php - 没有显示数据 MySql php

php - 多对一关系?

php - echo $xml_data->asXML();什么也不输出

php - 如何将 POST 数据加载到 SimpleXML 中?

没有 schemaLocation 的 XMLSchema 和 XMLSchema 实例 namespace

c# - 在 PHP 中将 int 转换为 char 在 C# 中有不同的输出