SimpleXMLElement
aregetDocNamespaces
和的两种方法getNamespaces
。两者对我来说似乎都一样,我尝试了彼此更改方法名称但结果相同的示例。
那么谁能给我解释一下,有什么区别?来自 php.net 的链接getNamespaces getdocnamespaces
SimpleXMLElement
aregetDocNamespaces
和的两种方法getNamespaces
。两者对我来说似乎都一样,我尝试了彼此更改方法名称但结果相同的示例。
那么谁能给我解释一下,有什么区别?来自 php.net 的链接getNamespaces getdocnamespaces
实际上,这些方法做了两个相似但不同的事情。两者都检索命名空间。两者甚至都可以递归地做到这一点。两者都可以对元素进行操作。
不同之处在于获取与/在特定元素上使用( ) 或在特定元素上定义( ) 的名称空间。###:element
xmlns:###="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
)
另见:
getDocNamespaces() 返回文档中声明的所有命名空间;getNamespaces() 仅返回文档中实际使用的命名空间。
getNamespaces() 文档页面中的示例 #1 显示了已xmlns:t="http://example.org/test"
定义但未使用的内容。