栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

参考-如何在SimpleXML中处理名称空间(带有冒号的标记和属性)?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

参考-如何在SimpleXML中处理名称空间(带有冒号的标记和属性)?

什么是XML名称空间?

:
标记或属性名称中的冒号()表示元素或属性在 XML名称空间中
。命名空间是一种在一个文档中组合不同XML格式/标准并跟踪哪个名称来自哪种格式的方法。冒号及其前面的部分实际上并不是标签/属性名称的一部分,它们只是指示其所在的名称空间。

XML名称空间具有 名称空间标识符 ,该 名称空间标识符
由URI(URL或URN)标识。URI并不指向任何内容,它只是某人“拥有”名称空间的一种方式。例如,SOAP标准使用名称空间,

http://www.w3.org/2003/05/soap-envelope
而Opendocument文件使用(以及其他)
urn:oasis:names:tc:opendocument:xmlns:meta:1.0
。问题中的示例使用名称空间
http://example.com
https://namespaces.example.org/two

在文档或文档的一部分中,名称空间被赋予 本地前缀
,这是您在冒号之前看到的部分。例如,在不同的文件中,SOAP命名空间可能会被给予本地前缀

soap:
SOAP:
SOAP-ENV:
env:
,或只
ns1:
。这些名称使用特殊
xmlns
属性(例如)链接回命名空间的标识符
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
。在特定文档中,前缀的选择完全是任意的,并且每次生成前缀时都可以更改而不会更改含义。

最后,每个文档或文档部分中都有一个 默认名称空间
,该名称空间是用于没有前缀的元素的名称空间。它由不

xmlns
带参数的属性定义
:
,例如
xmlns="http://www.w3.org/2003/05/soap-envelope"
。在上面的示例中,
<list>
位于默认名称空间中,该名称空间定义为
http://example.com

有点奇怪的是, 没有前缀的属性
从不在默认名称空间中,而是在一种“空名称空间”中,标准没有明确定义。

SimpleXML给我一个空对象;怎么了?

如果在带有名称空间的SimpleXML对象上使用

print_r
var_dump
或类似的“转储结构”函数,则某些内容将不会显示。
它仍然在那里,可以按如下所述进行访问。

如何在SimpleXML中访问名称空间?

SimpleXML提供了两种使用命名空间的主要方法:

  • ->children()
    方法允许您访问特定名称空间中的子元素。它可以有效地切换您的对象以查看该名称空间,直到您再次调用它以切换回另一个名称空间。
  • ->attributes()
    方法以类似的方式工作,但是允许您访问特定名称空间中的 属性

这两种方法都将 名称空间标识符
作为它们的第一个参数。由于这些标识符相当长,因此定义一个常量或变量来表示您正在使用的名称空间可能很有用,因此您不必在各处复制并粘贴完整的URI。

例如,上面的示例可能变成:

define('XMLNS_EG2', 'https://namespaces.example.org/two');define('XMLNS_SEQ', 'urn:example:sequences');foreach ( $sx->list->children(XMLNS_EG2)->item as $item ) {    echo 'Position: ' . $item->attributes(XMLNS_SEQ)->position . "n";    echo 'Item: ' . (string)$item . "n";}

简而言之,您还可以通过将第二个参数设置为,将方法传递给名称空间的
本地别名

true
。请记住,这可能前缀随时更改,例如,发电机可以分配的前缀
ns1
ns2
等,并以不同的顺序,如果代码稍有改变它们分配。使用此缩写,代码将变为:

foreach ( $sx->list->children('ns2', true)->item as $item ) {    echo 'Position: ' . $item->attributes('seq', true)->position . "n";    echo 'Item: ' . (string)$item . "n";}

(此缩写是在PHP 5.2中添加的,您可能会看到确实很老的示例,但使用了更冗长的版本

$sx->getNamespaces
来获取前缀-
标识符对的列表。这是两全其美,因为您仍然很难-编码前缀而不是标识符。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433099.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号