【问题标题】:What are the "$ns" and "$is_prefix" parameters about?“$ns”和“$is_prefix”参数是什么?
【发布时间】:2013-06-19 23:31:51
【问题描述】:

SimpleXMLElement::__construct() method 和相关函数 simplexml_load_string()simplexml_load_file() 都有一对与 XML 命名空间相关的可选参数:$ns$is_prefix

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

【问题讨论】:

    标签: php simplexml xml-namespaces


    【解决方案1】:

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

    $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.net cmets 中,您会做得很好。因为没有办法知道它。他们什么都没写……真的。
    猜你喜欢
    • 2011-04-14
    • 2010-10-03
    • 2011-05-03
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    相关资源
    最近更新 更多