通过 PHP SimpleXMLElement 在根元素中获取命名空间名称
Get Namespace Name in Root Element via PHP SimpleXMLElement
假设我有以下 XML(这是 ATOM 的标准)
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Example Feed</title>
<subtitle>A subtitle.</subtitle>
<link href="http://example.org/feed/" rel="self" />
<link href="http://example.org/" />
<id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>
<updated>2003-12-13T18:30:02Z</updated>
<entry>
<title>Atom-Powered Robots Run Amok</title>
<link href="http://example.org/2003/12/13/atom03" />
<link rel="alternate" type="text/html" href="http://example.org/2003/12/13/atom03.html"/>
<link rel="edit" href="http://example.org/2003/12/13/atom03/edit"/>
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
<updated>2003-12-13T18:30:02Z</updated>
<summary>Some text.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>This is the entry content.</p>
</div>
</content>
<author>
<name>John Doe</name>
<email>johndoe@example.com</email>
</author>
</entry>
</feed>
另外,假设上面的XML在地址为http://www.example.com/atom.xml
的网页中
我知道您可以通过以下代码获取根元素名称:
// Using curl to access the page
$ch = curl_init('http://www.example.com/atom.xml');
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$xml = new SimpleXmlElement($result);
$root = $xml->getName();
echo ($root) // This prints "feed", which is the root element
此外,我知道以下调用将获取所有根命名空间。
$xml->getNamespaces(true)
在我们的例子中,return 值为:
Array
(
[] => http://www.w3.org/2005/Atom
)
不过,我很想知道命名空间的名称。换句话说,我不知道调用哪个函数返回xmlns。我如何知道命名空间的名称?我需要它在处理之前做一些验证。
请帮忙,谢谢。
"However, I really like to know the name of the namespace. In other words, I do not know which function to call that returs xmlns".
xmlns
是命名空间声明的默认属性名称的 XML 语法。目前尚不清楚您要验证的内容,但我认为可以安全地假设如果 getNamespaces()
returns 名称空间前缀为空,则源 XML 具有有效的默认值命名空间(换句话说,源 XML 有 xmlns)。
引用自 W3C“Namespaces in XML”以方便参考:
If the attribute name matches DefaultAttName
, then the namespace name in the attribute value is that of the default namespace in the scope of the element to which the declaration is attached. In such a default declaration, the attribute value may be empty. Default namespaces and overriding of declarations are discussed in "5. Applying Namespaces to Elements and Attributes".
[Default Namespace]
[3] DefaultAttName
::= 'xmlns' .
[Default Attribute Name]
假设我有以下 XML(这是 ATOM 的标准)
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Example Feed</title>
<subtitle>A subtitle.</subtitle>
<link href="http://example.org/feed/" rel="self" />
<link href="http://example.org/" />
<id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>
<updated>2003-12-13T18:30:02Z</updated>
<entry>
<title>Atom-Powered Robots Run Amok</title>
<link href="http://example.org/2003/12/13/atom03" />
<link rel="alternate" type="text/html" href="http://example.org/2003/12/13/atom03.html"/>
<link rel="edit" href="http://example.org/2003/12/13/atom03/edit"/>
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
<updated>2003-12-13T18:30:02Z</updated>
<summary>Some text.</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>This is the entry content.</p>
</div>
</content>
<author>
<name>John Doe</name>
<email>johndoe@example.com</email>
</author>
</entry>
</feed>
另外,假设上面的XML在地址为http://www.example.com/atom.xml
我知道您可以通过以下代码获取根元素名称:
// Using curl to access the page
$ch = curl_init('http://www.example.com/atom.xml');
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$xml = new SimpleXmlElement($result);
$root = $xml->getName();
echo ($root) // This prints "feed", which is the root element
此外,我知道以下调用将获取所有根命名空间。
$xml->getNamespaces(true)
在我们的例子中,return 值为:
Array
(
[] => http://www.w3.org/2005/Atom
)
不过,我很想知道命名空间的名称。换句话说,我不知道调用哪个函数返回xmlns。我如何知道命名空间的名称?我需要它在处理之前做一些验证。
请帮忙,谢谢。
"However, I really like to know the name of the namespace. In other words, I do not know which function to call that returs xmlns".
xmlns
是命名空间声明的默认属性名称的 XML 语法。目前尚不清楚您要验证的内容,但我认为可以安全地假设如果 getNamespaces()
returns 名称空间前缀为空,则源 XML 具有有效的默认值命名空间(换句话说,源 XML 有 xmlns)。
引用自 W3C“Namespaces in XML”以方便参考:
If the attribute name matches
DefaultAttName
, then the namespace name in the attribute value is that of the default namespace in the scope of the element to which the declaration is attached. In such a default declaration, the attribute value may be empty. Default namespaces and overriding of declarations are discussed in "5. Applying Namespaces to Elements and Attributes". [Default Namespace][3]
DefaultAttName
::= 'xmlns' . [Default Attribute Name]