1

SimpleXMLElementaregetDocNamespaces和的两种方法getNamespaces。两者对我来说似乎都一样,我尝试了彼此更改方法名称但结果相同的示例。

那么谁能给我解释一下,有什么区别?来自 php.net 的链接getNamespaces getdocnamespaces

4

2 回答 2

2

实际上,这些方法做了两个相似但不同的事情。两者都检索命名空间。两者甚至都可以递归地做到这一点。两者都可以对元素进行操作。

不同之处在于获取与/在特定元素上使用( ) 或在特定元素上定义( ) 的名称空间。###:elementxmlns:###="XMLNS-URI"

一些例子:

getNamespaces获取使用的命名空间。例如,如果您在树中的某处有一个 person 元素,例如:

...
   <p:person t:id="1">John Doe</p:person>
...

你用

$sxe->person[0]->getNamespaces(TRUE);

在它上面,它会给你两个命名空间,这两个在那个元素上使用:

[p] => http://example.org/ns
[t] => http://example.org/test

getDocNamespaces不同的是,在对同一元素进行操作时,将为您提供定义的命名空间:

$sxe->person[0]->getDocNamespaces(TRUE, FALSE);

由于该元素未定义任何元素,因此数组为

与此不同的是,在不同的第二人称元素上:

...
    <p:person t:id="2" a:addr="123 Street" xmlns:a="http://example.org/addr">
        Susie Q. Public
    </p:person>
...

$sxe->person[1]->getDocNamespaces(TRUE, FALSE);

将为您提供一个名称空间,因为它是在那里定义的:

[a] => http://example.org/addr

这应该澄清它。您可以通过不同的参数组合进行一些排列,所以这里有一些示例脚本(Demo):

<?php
/**
 * @link https://stackoverflow.com/a/18354621/367456
 */

$xml = <<<XML
<?xml version="1.0" standalone="yes"?>
<people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
    <p:person t:id="1">John Doe</p:person>
    <p:person t:id="2" a:addr="123 Street" xmlns:a="http://example.org/addr">
        Susie Q. Public
    </p:person>
</people>
XML;

$sxe = new SimpleXMLElement($xml, 0, FALSE, 'http://example.org/ns');

echo 'person[0]->getNamespaces(TRUE): ', 
!print_r($sxe->person[0]->getNamespaces(TRUE)), "\n";

echo 'person[0]->getNamespaces(FALSE): ', 
!print_r($sxe->person[0]->getNamespaces(FALSE)), "\n";

echo 'person[0]->getDocNamespaces(TRUE): ', 
!print_r($sxe->person[0]->getDocNamespaces(TRUE)), "\n";

echo 'person[0]->getDocNamespaces(TRUE, FALSE): ', 
!print_r($sxe->person[0]->getDocNamespaces(TRUE, FALSE)), "\n";

echo 'person[1]->getDocNamespaces(TRUE, FALSE): ', 
!print_r($sxe->person[1]->getDocNamespaces(TRUE, FALSE)), "\n";

echo 'sxe->getNamespaces(FALSE): ', 
!print_r($sxe->getNamespaces(FALSE)), "\n";

echo 'sxe->getDocNamespaces(TRUE, FALSE): ', 
!print_r($sxe->getDocNamespaces(TRUE, FALSE)), "\n";

echo 'sxe->getDocNamespaces(FALSE, FALSE): ', 
!print_r($sxe->getDocNamespaces(FALSE, FALSE)), "\n";

echo 'sxe->getNamespaces(TRUE): ', 
!print_r($sxe->getNamespaces(TRUE)), "\n";

echo 'sxe->getDocNamespaces(TRUE): ', 
!print_r($sxe->getDocNamespaces(TRUE)), "\n";

输出:

person[0]->getNamespaces(TRUE): Array
(
    [p] => http://example.org/ns
    [t] => http://example.org/test
)

person[0]->getNamespaces(FALSE): Array
(
    [p] => http://example.org/ns
    [t] => http://example.org/test
)

person[0]->getDocNamespaces(TRUE): Array
(
    [p] => http://example.org/ns
    [t] => http://example.org/test
    [a] => http://example.org/addr
)

person[0]->getDocNamespaces(TRUE, FALSE): Array
(
)

person[1]->getDocNamespaces(TRUE, FALSE): Array
(
    [a] => http://example.org/addr
)

sxe->getNamespaces(FALSE): Array
(
)

sxe->getDocNamespaces(TRUE, FALSE): Array
(
    [p] => http://example.org/ns
    [t] => http://example.org/test
    [a] => http://example.org/addr
)

sxe->getDocNamespaces(FALSE, FALSE): Array
(
    [p] => http://example.org/ns
    [t] => http://example.org/test
)

sxe->getNamespaces(TRUE): Array
(
    [p] => http://example.org/ns
    [t] => http://example.org/test
    [a] => http://example.org/addr
)

sxe->getDocNamespaces(TRUE): Array
(
    [p] => http://example.org/ns
    [t] => http://example.org/test
    [a] => http://example.org/addr
)

另见:

于 2013-08-21T10:09:52.303 回答
1

getDocNamespaces() 返回文档中声明的所有命名空间;getNamespaces() 仅返回文档中实际使用的命名空间。

getNamespaces() 文档页面中的示例 #1 显示了已xmlns:t="http://example.org/test"定义但未使用的内容。

于 2013-08-21T10:04:40.997 回答